보통 프로그래밍 언어를 통해 프로그램을 만들 때, IDE를 사용하여 소스를 컴파일하고 빌드하며 실행시킨다. 이러한 경험(?) 혹은 시간이 길어질수록 어쩌면, 어떤 사람은 IDE에서 자동으로 프로그램을 실행시키기까지의 과정 및 방법에 대하여 잊는 경우도 생기게 된다. 그런 사람(==나)을 위하여 Java 언어로 작성된 소스파일을 컴파일하고 실행 가능한 Jar 파일을 명령어를 통해 만드는 방법을 공유해본다.
내가 작성한 Java 소스 파일은 매우 간단하다. 심심풀이로 CPU Load Simulcast 프로그램을 만들어봤다.
[CPULoadThread.java]
package com.tistory.johnmark;
public class CPULoadThread extends Thread {
private final double load;
private final long duration;
public CPULoadThread(String name, double load, long duration) {
super(name);
this.load = load;
this.duration = duration;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
try {
while (System.currentTimeMillis() - startTime < duration) {
if (System.currentTimeMillis() % 100 == 0) {
sleep((long)Math.floor((1 - load) * 100));
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
[Load.java]
package com.tistory.johnmark;
import java.util.Scanner;
public class Load {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("CPU Load Simulcast......");
System.out.print("NumberOfCore: ");
int numberOfCore = scanner.nextInt();
System.out.print("NumberOfThreadPerCore: ");
int numberOfThreadPerCore = scanner.nextInt();
System.out.print("Load Percent: ");
double load = scanner.nextDouble();
System.out.print("Load Simulcast Duration: ");
long duration = scanner.nextLong();
System.out.println("======================================================================");
System.out.println("LOAD TEST SETTING INFO");
System.out.println("======================================================================");
System.out.println("numberOfCore = " + numberOfCore);
System.out.println("numberOfThreadPerCore = " + numberOfThreadPerCore);
System.out.println("load = " + load);
System.out.println("duration = " + duration);
System.out.println("======================================================================");
for (int thread = 0; thread < numberOfCore * numberOfThreadPerCore; thread++) {
new CPULoadThread("Thread - [" + thread + "]", load, duration).start();
}
}
}
CPU Load Simulcast 하는데 있어서 사용할 CPU 코어의 개수, 코어당 사용할 스레드의 개수, 로드율, 부하 시간 등을 입력받으면, 코어당 스레드 개수만큼의 스레드를 생성하여 CPU 점유율을 높이는 간단한 프로그램이다.
프로젝트 구조는 다음과 같다. 노란건 디렉토리이고, 주황색은 파일이다.
현재 사용하고 있는 자바 버전은 다음과 같이 openJDK 1.8.0_275 버전이다.
그럼 가장 먼저 작성한 자바 파일(*.java) JVM이 해석 가능하도록 바이트 코드를 담운 클래스 파일(*. class)로 컴파일해보자.
javac는 Java Compiler 프로그램으로 -d 옵션으로 컴파일의 결과물인 class 파일이 위치할 경로와 java 파일들을 파라미터로 받는다. 난 현재 프로젝트의 out 디렉토리 하위에 class 파일들이 위치하도록 하였고, 대상 java 파일은 src/com/tistory/johnmark/ 디렉토리 하위의 모든 자바 파일을 대상으로 하였다. 참고로 javac -d 옵션에 사용되는 디렉토리는 미리 만들어져있어야 한다. javac에서는 디렉토리를 만들지 않는다. 이에 tree 명령어로 다시 프로젝트 구조를 살펴보면 out 디렉토리 하위에 class 파일을 이 java 파일들과 매칭 되어 만들어져 있는 것을 확인할 수 있다.
class 파일을 한번 열어보면 다음과 같이 보인다. 전혀 알 수가 없다 ㅎ
그럼 만들어진 class 파일들을 모두 모으고 실행 가능한 jar 파일로 만들기 위해 가장 먼저 jar파일이 참조할 manifest 파일을 만들어야 한다. 우리는 일단 메인 클래스에 대한 정보를 넣어주면 된다.
[manifest.txt]
Main-Class: {메인클래스의 경로}를 manifest.txt에 적어주면 된다. 주의할 점은 패키지 경로까지 모두 작성해야 한다는 점이다.
그다음에 jar 명령어를 통해 실행 가능한 Jar 파일을 만들어 보자.
jar 명령어를 통해 cpu-simulcast.jar 파일이 성공적으로 만들어진 것을 확인할 수 있다.
jar 명령어에 대한 자세한 내용은 아래를 참고하자.
docs.oracle.com/en/java/javase/15/docs/specs/man/jar.html
그럼 한번 jar 파일을 실행시켜 보자! 😁
CPU 부하가 순간적으로 높아지는 것을 확인할 수 있다. 프로그램이 종료된 뒤에는 다음과 같이 정상 상태로 돌아오게 된다.
[소스파일]
github.com/LoveAndCode/Cpu-Load-Simulcast.git
'Programming > Java' 카테고리의 다른 글
[Java8] 함수형 인터페이스와 람다 표현식 (0) | 2021.06.26 |
---|---|
객체, 클래스 그리고 인스턴스 (0) | 2021.06.15 |
[Java8] 윤년, 다음달 말일 계산 (0) | 2020.07.17 |
[Java] AES 256 암복호화 유틸클래스 (0) | 2020.07.15 |
[Java] 사용하는 라이브러리의 라이선스 내용 출력하기 (0) | 2020.07.04 |