해당 글은 Java 프로젝트를 cmd로 컴파일하는 방법을 간략하게 정리해놓았습니다. 이론이나 원리에 관한 글은 다른 글을 참조해주시면 감사하겠습니다.
테스트 환경: Windows 10, openjdk version 13.0.2
1. 하나의 클래스 컴파일하기
자바에서 하나의 클래스를 컴파일할 때에는 매우 간단한 명령어로 해결할 수 있다.
예를 들어 HelloWorld.java 파일을 작성했다면 다음과 같이 컴파일할 수 있다.
javac HelloWorld.java
만약 인코딩이 필요하다면 다음과 같이 인코딩도 붙여서 컴파일할 수 있겠다.
javac HelloWorld.java -encoding UTF-8
2. 여러 개의 클래스 컴파일하기
여러 개의 클래스가 있을 경우에는 컴파일하고자 하는 java 파일을 모두 명시해주면 된다.
Hello.java와 World.java를 컴파일하려면 다음과 같이 컴파일할 수 있다.
javac Hello.java World.java
혹은 같은 폴더 내의 여러 개의 파일을 한 번에 컴파일하고 싶으면 와일드 카드를 쓸 수 있다.
javac *.java
상대 경로를 통해 다른 패키지(폴더)의 파일도 컴파일할 수 있다.
현재 폴더 하위에 A 폴더와 B 폴더가 있을 때, 두 폴더의 모든 java 파일을 컴파일할 수도 있다.
javac A/*.java B/*.java
참고로 상대 경로는 다음과 같이 표기한다.
상대 경로
/ : 루트
./ : 편재 위치
../ : 현재 위치의 상단 폴더
출처: https://88240.tistory.com/122
만약 자바 표준 라이브러리에 존재하지 않는 외부 라이브러리를 사용할 경우에는 Classpath를 사용해야 한다.
3. 클래스가 외부 라이브러리를 Import 할 때
자바에서 외부 라이브러리 파일이나 jar 파일을 포함하여 컴파일하기 위해서는 Classpath를 이용하여 컴파일할 수 있다.
Classpath는 사용자 정의 클래스 및 API 패키지의 경로를 지정하는 자바가상머신(JVM) 또는 Java 컴파일러의 매개 변수이다.
Cmd에서 컴파일할 때에는 -classpath 또는 -cp 옵션으로 줄 수 있다.
-cp <class search path of directories and zip/jar files>
-cp 다음에는 포함하고자 하는 라이브러리나 jar 파일의 경로를 적어준다. -cp 다음에 쓰는 경로명은 상대 경로나 절대 경로 두 방식 모두 사용해도 가능하다.
라이브러리가 여러 개일 경우, 구분자를 써 주어야 한다.
Linux 운영체제에서는 콜론(:)으로, Windows 운영체제에서는 세미콜론(;)으로 구분할 수 있다.
예를 들어 외부 라이브러리가 포함된 ext 폴더의 external.jar 파일을 이용해서 현재 폴더의 모든 java 파일을 컴파일하려면
javac -cp ext/External.jar *.java
javac -cp "ext/External.jar" *.java
javac -cp ".;./ext/External.jar" *.java
(셋 모두 가능함)
이 셋 중 하나로 쓸 수 있겠다. 여러 개의 파일을 포함할 때에도 다음처럼 쓰면 된다.
javac -cp "ext/External1.jar;ext/External2.jar;ext/External3.jar" *.java
javac -cp ".;./ext/External1.jar;./ext/External2.jar;./ext/External3.jar" *.java
(둘 모두 가능함)
javac -cp ".;./ext/External1.jar;./ext/External2.jar;./ext/External3.jar" Hello.java World.java (여러 개의 파일을 컴파일할 때)
다만 주의해야 할 점은 jar 파일들을 와일드 카드(*)를 이용해서 지정하려고 하면 뒤에 jar 확장자를 쓰면 안된다.
javac -cp "ext/*" *.java
이렇게 컴파일한 class 파일들을 실행하려면 똑같이 하면 된다.
java -cp ext/*; Hello
java -cp ./ext/*; Hello
(둘 모두 가능함, classpath 가장 마지막에 구분자를 붙이지 않으면 오류가 생김)
내 환경에서는 실행하고자 하는 main 클래스인 Hello 이전에 구분자(;)가 없으면 실행이 되지 않는 문제가 있었다.
javac 명령어로는 classpath 마지막에 세미콜론을 붙이지 않아도 되는데 java 명령어로는 classpath 마지막에는 구분자를 붙여야 실행이 되었다.
혹시나 원인을 아는 사람은 댓글을 달아주면 감사하겠다.
댓글