[java] java와 maven으로 어디에서나 실행가능한 프로그램(exe) 만들기
개인적인 용도의 유틸리티성 프로그램을 만들다 보면, 문득 자바가 그리워졌다.
방대한 라이브러리로 인해 개발 생산성이 향상된다는 것이 그 이유인데,
C와는 달리 자바는 빌드 후 JVM을 이용하여 직접 실행해주어야 하며, 이로 인해 자바를 모르는 사람들은 자바로 만든 유틸리티를 실행하기 쉽지 않다는,
유틸리티로써는 매우 치명적인 단점이 있다.
그러던 중, 우연히 jar파일을 exe로 변환하는 방법을 알게 되어 독립적인 프로그램을 만들기 위해 삽질을 해보았고,
exe파일에 나의 어플리케이션 코드와 기타 라이브러리를 번들로 컴파일하여 번거로운 실행으로부터 완전히 자유로운 자바 프로그램을 만들게 되어 그 경험을 공유하고자 한다.
준비하기
우선 필자는 eclipse를 이용하여 maven 으로 jar 파일을 빌드 한 다음, Launch4j라는 툴을 이용하여 jar를 exe파일로 변환하는 식으로 진행하였다.
이를 위해 java와 ecelipse환경 세팅이 필요하며, Launch4j는 SorceForge에서 구할 수 있다.
SourceForge에서 Download Latest Version 버튼을 눌러 launch4j 설치 파일(20.09.28 기준 버전 3.12)을 다운받아 실행한 후, 안내에 따라 설치한다.

그 다음 자바로 프로그램을 만들기 위해 프로젝트를 생성한 후, 메이븐 프로젝트로 전환해준다.

이렇게 하면 프로젝트 내에 pom.xml 파일이 생기는데, 이는 maven에서 Dependency를 관리하기 위한 파일로, 이는 여기서 다루기엔 너무 큰 주제이니, 기회가 되면 독립적인 주제로 다뤄보겠다.
pom.xml의
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass> <!--메인 클래스의 path --> </mainClass>
</manifest>
</archive>
</configuration>
</plugin>maven-assembly-plugin은 maven 프로젝트의 결과물을 dependency, module, 기타등등의 파일을 단일 아카이브로 만들게 해주는 플러그인이다.
이를 이용해 우리가 만들 자바 프로젝트를 단일 jar파일로 만들고, 종속 모듈(dependencies)들을 모두 주입하여 하나의 실행파일(Excutable Jar)로 만들어낼것이다.
참고로, maven-assembly-plugin은 jar 뿐만 아니라 다른 형식도 지원한다.
- zip
- tar
- tar.gz (or tgz)
- tar.bz2 (or tbz2)
- tar.snappy
- tar.xz (or txz)
- jar
- dir
- war
- and any other format that the ArchiveManager has been configured for
이외 자세한 사항은 maven document를 참고하자.
메인 클래스는 말그대로 main메소드가 존재하는 클래스를 칭하며, 패키지경로를 포함하여 기입한다.

(프로젝트의 구조가 위와 같고, 메인 메소드가 Application.java에 존재할 때, 메인클래스의 패스는 다음과 같은 형식을 띈다.)
com.convert.prj.Application
Make It!
이제 준비가 끝났다. 이제 원하는 프로그램을 java로 구현하고, 빌드할 차례다.
여기서는 Apache POI를 이용하여 엑셀 파일을 생성하는 예제를 만들어보겠다.
우선 POI를 사용하기 위해 pom.xml에 dependency를 추가해준다.
..
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
..
</project>Apache POI는 엑셀파일과 관련된 작업을 하기위해 가장 많이 사용되는 라이브러리이다.
이 라이브러리를 통해 엑셀 파일을 생성/수정하거나, 읽어들여 데이터화 할 수 있다.
우선, 엑셀 파일을 만드는 간단한 class를 작성한다.
ExcelMaker.java
package com.convert.prj;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelMaker {
/**
*
* @return Not Saved to disk XSSFWorkbook Object
* @throws IOException
*/
public XSSFWorkbook getExcelFile() throws IOException {
XSSFWorkbook wb = new XSSFWorkbook();
// do something...
return wb;
}
/**
*
* @param wb XSSFWorkbook Object for save
* @param path where you save specified path
* @return save has successful then true else return false
*/
public boolean saveExcelFile(XSSFWorkbook wb, String path) {
try (FileOutputStream stream = new FileOutputStream(path)) {
wb.write(stream);
return true;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
}그리고 main에서, standard input으로 엑셀 파일을 생성할 path를 입력받은 후, ExcelMaker를 호출한다.
Application.java
package com.convert.prj;
import java.io.IOException;
import java.util.Scanner;
public class Application {
public static void main(String[] args) throws IOException {
try(Scanner sc = new Scanner(System.in);){
System.out.println("type the path : ");
String path = sc.nextLine();
ExcelMaker s = new ExcelMaker();
s.saveExcelFile(s.getExcelFile(), path);
}catch(Exception e) {
e.printStackTrace();
}
}
}어플리케이션 작성이 완료되면, 아래와 같이 Maven build를 수행해준다.


위와 같이 작성후 Run버튼을 눌러주면, maven이 Project의 target 폴더에 Excutable jar파일을 생성해준다.

이렇게 생성된 Excutable jar 파일은 다른 jar 파일에 비하여 비교적 용량이 큰 것을 볼 수 있는데,
이는 실행에 필요한 라이브러리까지 모두 jar파일 내부에 포함시켰기 때문이다.
이 상태에서 java 명령어를 통해 jar파일을 바로 실행할 수도 있지만,
우리의 목적은 .exe이므로, 아직 가야할 길이 남았다.
우선 launch4j를 실행한다.

output file에는 원하는 결과물의 경로와 파일명.exe를, jar 에는 우리가 방금 빌드한 Excutable jar 파일의 경로를 명시해준다. (각 칸의 옆에있는 폴더 모양 버튼을 통해 입력할 수도 있다.)

그 다음 , Main Class를 명시하는 칸 옆에 폴더모양 버튼을 누르고, 우리가 생성한 Jar를 선택하면, 자동으로 Main Class가 잡힌다.
이제 모든 과정이 끝났다.
launch4j 상단의 톱니바퀴 모양의 버튼을 누르고, 설정파일을 저장하면 자동적으로 해당 경로에 결과물.exe파일이 생성된다. 생성된 실행파일을 실행하면…

매우 잘 실행된다!
이렇게 우리는 라이브러리까지 모두 포함한 독립된 자바 프로그램을 편리하게 실행할 수 있게 되었다.
물론 JRE가 설치되어 있어야 한다는 제약사항이 존재하지만, 자바의 막강한 생산성은 그 단점을 커버 해줄수도 있다.
자바로 웹개발만 해왔다면, 그 웹개발로 쌓은 지식을 이용해 나만의 유틸리티를 만들어보는건 어떨까?
Leave a comment