리눅스에서 java 컴파일 및 실행 하기

상용 서비스가 되고 있는 상태에서 고객의 요구 사항으로 인하여 자바 데몬 형식의 프로그램을 개발해야 할 때가 있다.

이런 프로그램들은 대게 상용 리눅스 장비에 class 파일을 올린 후 java 명령어를 통해 프로그램을 실행하게 되는데 이것이 생각보다 어렵다.

예전에도 class 파일을 실행하기 위해 몇 번 삽질을 했었는데 어김없이 또 삽질을 하게 되었다.

사실 자바를 처음할 때 배우는 것들인데 이런 삽질을 하는 내 모습을 보면 쪽팔리기도 하다.

그래서 이참에 확실하게 정리를 하고자 한다.

두 가지 방법에 대해서 설명을 할 것이다.

첫 번째는 “패키지 선언되어 있는 java 파일 컴파일 후 실행하기

두 번째는 “외부 jar 파일을 classpath에 추가한 후 컴파일하고 실행하기

첫 번째의 경우는 JDK에서 기본적으로 제공하는 API인 src.zip(rt.jar)만을 사용하기 때문에 그닥 사용할 일이 별로 없지만 기본적인 사항이니 일단은 정리한다. (src.zip은 java 파일이 있고, rt.jar는 class파일이 존재)

1. 패키지 선언되어 있는 java 파일 컴파일 후 실행하기

  • javac -d . HelloWorld.java
    현재 디렉토리를 클래스 패스로 지정하고 컴파일 하게 되면 패키지 디렉토리가 생성이 되면서 HelloWorld.class 파일이 해당 디렉토리에 저장
     <- packagetest 디렉토리 안에 class 파일 존재
  • 그런 후 다음 명령어를 실행하면 정상적으로 java를 실행할 수 있다.
    java -cp . packagetest.HelloWorld

package packagetest;

 

public class HelloWorld { 

        public static void main(String[] args) {

               System.out.println(“Hello
World!”
);

        }

}


2. 외부 jar 파일을 classpath에 추가한 후 컴파일하고 실행하기

  • javac -d . -cp jackson-core-asl-1.8.5.jar:jackson-mapper-asl-1.8.5.jar HelloWorldJson.java
    컴파일 단계 시 JSON 라이브러리를 필요로 하기 때문에 클래스 패스에 jar를 추가해 줘야 한다.
  • java -cp jackson-core-asl-1.8.5.jar:jackson-mapper-asl-1.8.5.jar:. packagetest.json.HelloWorldJson
    컴파일 단계와 동일하게 JSON 라이브러리를 클래스 패스에 추가
  • java -cp ./*:. packagetest.json.HelloWorldJson
    외부 jar 파일을 classpath에 많이 추가해야 하는 경우가 발생하면 * 를 통해서 간단하게 해결할 수 있다.

package packagetest.json;

 

import java.io.IOException; 

import
org.codehaus.jackson.JsonGenerationException;

import
org.codehaus.jackson.map.JsonMappingException;

import org.codehaus.jackson.map.ObjectMapper;

 

public class HelloWorldJson {

 

        public static void main(String[] args) throws JsonGenerationException, JsonMappingException,
IOException {

               System.out.println(“Hello
World!”
);

 

               ObjectMapper mapper = new ObjectMapper();

               String jsonData =
mapper.writeValueAsString(
“kyuTest”);

               System.out.println(jsonData);

        }

}

여기까지 두 가지 방법에 대해서 알아봤다.

헌데 classpath가 뭔지 그리고 점(.) 또는 콜론(:) 과 같은 기호는 어떤 의미를 부여하는 지에 대해서 알아보자.

자바 런타임으로 class 파일을 실행하고자 할 때에는 class 파일을 찾을 수 있어야 한다.

그래서 class 파일을 찾을 때 classpath에 지정된 경로를 사용한다. 이때 classpath로 지정 가능한 유형은 다음과 같이 세 가지가 있다.

디렉토리 유형 : /home/kyu/test/java/classes

zip 파일 유형 : utils.zip

jar 파일 유형 : utils.jar


java -h 명령어를 통해서도 classpath 유형을 확인할 수 있다.


이렇게 classpath로 세 가지 유형을 제공하고, 디렉토리 또는 jar 파일을 classpath로 지정해야 할 필요가 있다면 콜론(:) 을 이용하여 패스들을 연결할 수 있다.

/home/kyu/test/java/classes:utils.zip:utils.jar

마지막으로 점(.)의 의미는 현재 디렉토리를 classpath로 지정하겠다는 의미이다.

결론

 classpath

 자바 런타임이 class 파일을 찾을 때 사용하는 경로

 콜론(:)

 클래스 패스들을 연결할 때 사용

 점(.)

 java 명령어를 실행하는 디렉토리를 classpath로 지정하겠다는 의미