본문 바로가기
프로그래밍 언어/Java

자바 cmd에서 외부 라이브러리, Jar을 포함하여 컴파일 및 실행하기

by 니키티스 2020. 10. 8.

해당 글은 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 마지막에는 구분자를 붙여야 실행이 되었다.

혹시나 원인을 아는 사람은 댓글을 달아주면 감사하겠다.

댓글