coding life/JAVA

[JAVA] CMD로 JAVA 소스코드 실행하기

효짱 2021. 7. 6. 13:51

개발을 하다보면 이클립스 개발 환경이 아닌, CMD나 터미널에서 소스 코드를 실행해야 할 때도 있을 것이다. 이클립스를 사용하여 소스 코드 파일을 저장하게 되면 자동으로 바이트 코드 파일이 생성되는데, 이때 소스 코드 파일은 src 파일에 저장이 되고, 바이트 코드 파일은 bin 파일에 저장된다. 만약 이클립스를 사용하지 않고 소스 코드를 만들면 소스 코드 파일만 저장이 될 것이다.

 

CMD 등 IDE 프로그램이 아닌 경우에서는, 소스 코드를 바이트 코드로 직접 변경해줘야한다. 이 과정을 직접 해볼 것이다.

우선 소스코드가 들어있는 파일로 넘어간다.

https://hyojin-p.tistory.com/13

 

[JAVA] 자바의 기초/이클립스 프로젝트 만들기

자바의 기초 자바로 코딩을 시작하기 전에, 코딩 과정의 흐름에 대해서 적어보려고 한다. 우선 컴퓨터는 우리가 작성한 소스코드를 그대로 이해하지 못한다. 따라서 우리가 적은 소스 코드를 컴

hyojin-p.tistory.com

위의 예제로 생각하고 이클립스를 사용하지 않았다는 가정하에,

C:\Users\eclipse-workspace\newproject01 에서 실행을 해야한다. 우선 src 폴더 속 소스 코드를 javac로 컴파일 한다. 이때 javac는 버전에 따라 명령어 사용이 다른데, 크게 JDK 8이전인지, JDK 11 이후인지로 나뉘어있다.

지금부터 이 두 경우를 모두 살펴보도록 할 것이다.

 

*참고 - Window CMD 창 열기

윈도우키 + R 을 누른 뒤, 실행 창에서 CMD 작성 후 엔터

 

JDK 8 이전 버전

JDK 8 이전 버전에서의 컴파일은 다음과 같다.

javac -d (바이트 코드 파일 저장 위치) (소스 경로/*.java)
tree /f /a

프로젝트에 응용하여 JAVAC로 컴파일을 해보자. javac- 진행 후,  tree /f /a를 하면 bin 폴더에 바이트 코드가 생성됨을 확인할 수 있다.

javac –d bin src/sample/01/*.java
tree /f /a

이제 java 명령어로 바이트 코드 파일을 실행시킨다. 이것 역시 JDK 8 이전 버전과 JDK 11 이후 버전의 방법이 나뉜다.

java -cp (바이트 코드 파일 저장 위치) (패키지 이름 ~ 클래스 이름)

위의 명령어를 응용하여 예제에 적용시켜 보자.

이때, 바이트 코드 파일은 .class가 붙지만 java 명령어로 실행할 때는 확장자를 생략한다.

java –cp bin sample.01.Hello

CMD에서 Output이 출력된 것을 확인해 볼 수 있다.

 

JDK 11 이후 버전

11 이후는 모듈 기술자에 의존성 모듈이 적혀있기 때문에 모듈 기술자도 컴파일 대상에 포함시켜야한다. 다시말해 컴파일러가 소스 파일을 컴파일 할 때, 모듈 기술자에서 의존성 모듈을 참고하므로 모듈 기술자도 같이 컴파일 해주면 된다.

8버전과 동일하게 javac로 컴파일 하고 tree 명령어를 해주면, bin 폴더에 모듈 기술자도 같이 바이트 코드 파일이 생긴 것을 볼 수 있다. 명령어는 다음과 같다.

javac -d (바이트 코드 파일 저장 위치) (소스 경로/module-info.java 소스 경로/*.java)
tree /f /a

위 명령어를 예시에 적용하면, 

javac –d bin src/module-info.java src/sample/01/*.java
tree /f /a

컴파일이 완료되었다. 이 과정이 끝났으면 마찬가지로 java를 사용하여 바이트 코드를 실행한다.

javac -p (바이트 코드 파일 저장 위치) -m 모듈/패키지 이름 ~ 클래스 이름

실행 방식이 조금 달라진 것을 확인할 수 있는데, 그 이유는 모듈 기술자를 읽어야하기 때문이다. –m 옵션 뒤의 모듈 기술자 이름(지금까지 진행한 샘플에 대응하면 패키지 이름)이 모듈명이며, 해당 명령어의 이름이 모듈 기술자의 모듈명과 동일하면 JVM은 모듈 기술자의 내용을 읽고 바이트 코드 파일을 실행할 때 참고하게 된다. 예제에 적용하면 다음과 같다.

Java –p bin –m newproject01/sample.01.Hello

CMD에도 출력된 결과물을 확인할 수 있을 것이다.

 

 

[참고] 의존성 모듈

JDK 8 이전 버전까지는 표준 API 전체가 제공되어 문제가 없었지만, JDK 11 이후 버전부터는 JDK가 제공하는 표존 API를 모듈별로 쪼개어서 제공한다. 두 버전 다 기본적으로 java.base 모듈을 사용할 수 있지만 다른 모듈에 있는 API를 사용하고 싶다면 JDK 11 이후의 버전에서는 반드시 모듈 기술자에 의존성 모듈로 등록해야한다.

 

이전 프로젝트 생성시, 작성했던 예시를 생각해보면,

module newproject01{
	requires java.se; 	// JAVA SE가 제공하는 모든 모듈이 필요하다는 의미
}

JAVA SE(JDK)가 제공하는 모든 표준 모듈이 필요하다고 적어뒀으므로, JAVA SE 전체에 의존성을 가진다. 이렇게 설정해두면 JDK 8 이전 버전과 같이 표준 API 전체를 제공받는 것과 동일한 효과가 나타나는 것이다.