사이드 프로젝트 개발을 마무리하고 다른 환경에서 실행을 시켜보고 싶어졌다. 개발은 MacOS 노트북에서 진행했고, 만든 어플리케이션을 항상 켜두고 싶어서 집에 있는 데스크톱 Windows PC 에서 실행시켜보고 싶었다. 그 과정을 기록해보고자 한다.
Executable jar 가 뭐지?
핵심은 executable jar (실행가능한 jar) 파일을 개발한 환경에서 만들고 그 파일을 다른 환경에서 실행하는 것이다. Executable jar 파일은 메인 클래스와 어플리케이션이 의존하고 있는 다양한 라이브러리, 의존성들을 함께 포함하고 있는 파일이다. 다른 용어로는 fat jar 라고도 불린다.
생성은 어떻게 하지?
스프링부트 환경에서 어플리케이션을 실행하는 클래스 (예: SampleApplication.java)가 포함된 모듈에서 gradle build 를 해주면 된다. 보통 xxxAplication.java 파일은 아래처럼 생겼다.
@SpringBootApplication
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class);
}
}
예를 들어, 이 클래스 파일이 :apps:app-api 모듈 내에 포함되어 있다면 executable jar 파일을 만드는 과정은 다음과 같다.
$ ./gradlew clean :apps:app-api:build
gradle build 를 해주면 app-api-1.0-SNAPSHOT-boot.jar 이름으로 executable jar 파일이 /build/libs 경로에 생성된다.
실행은 어떻게 시킬 수 있을까?
아래 커맨드를 실행하면 된다.
$ java -jar app-api-1.0-SNAPSHOT-boot.jar
build.gradle 설정하기
사실 executable.jar 파일을 만드는 과정은 build.gradle 파일을 빌드하는 것인데, 단순히 빌드만 한다고 해서 해결되는 것은 아니다. build.gradle 파일을 잘 설정해주어야 하는데, 아래 코드를 참고하도록 하자.
// :apps:app-api 모듈의 build.gradle
apply(plugin = "org.springframework.boot")
val appMainClassName = "sample.kdohyeon.blog.BlogApiApplication"
tasks.getByName<Jar>("jar") {
enabled = false
}
tasks.getByName<org.springframework.boot.gradle.tasks.bundling.BootJar>("bootJar") {
enabled = true
mainClass.set(appMainClassName)
archiveClassifier.set("boot")
}
// 기타 모듈의 build.gradle
apply(plugin = "java-library")
tasks.getByName<Jar>("jar") {
enabled = true
}
bootJar? jar?
위 코드를 보면 bootJar 도 나오고 그냥 jar 도 나오는데 그 차이가 뭘까?
bootJar 는 메인 클래스와 의존성을 모두 묶어 놓은 것이고, jar 는 메인 클래스만 묶어 놓은 것이다. 따라서, 실행가능한 jar 가 만들어져야 하는 apps:app-api 모듈에서는 jar.enabled = false, bootJar.enabled = true 로 설정하고, 나머지 기타 모듈에서는 jar.enabled = true 로 하여 의존성을 관리해준다.
- bootJar 로 만들어진 파일은 실행가능한 jar 파일, 즉 executable jar, fat jar 라고도 불리며
- jar 로 만들어진 파일은 일반 jar, 즉 plain jar 라고도 불린다.
'스프링' 카테고리의 다른 글
[Gradle] Build Lifecycle (0) | 2023.02.16 |
---|---|
[스프링] @CircuitBreaker 적용하기 (0) | 2023.02.16 |
[스프링] H2 데이터베이스 사용하기 (0) | 2023.02.09 |
[스프링] 멀티 모듈 환경에서 application.yml 사용하기 (0) | 2023.02.09 |
[스프링] @Valid 사용과 테스트 케이스 작성하기 (0) | 2023.02.06 |
댓글