Gradle "bootJar"와 "jar" 태스크로 생성되는 jar 파일의 차이점
bootJar 태스크는 실행 가능한 jar 파일을 생성한다.
bootJar 태스크를 실행하여 tree
명령으로 생성한 파일을 살펴보자.
tree
명령을 사용하려면, 따로 설치가 필요하므로 없다면 homebrew로 install를 진행한다.
$ brew install tree
bootJar 명령으로 생성되는 {project-dir}/build/libs/
에 파일명은 {project-name}.jar
이다.
jar 파일의 압축을 풀어서, 아래와 같이 tree
명령을 실행한다.
% tree -L 3 --filelimit 10
.
├── BOOT-INF
│ ├── classes
│ │ ├── META-INF
│ │ ├── application.yml
│ │ ├── com
│ │ │ └── devkuma
│ │ │ └── api
│ │ └── logback-spring.xml
│ ├── classpath.idx
│ ├── layers.idx
│ └── lib [294 entries exceeds filelimit, not opening dir]
├── META-INF
│ ├── MANIFEST.MF
│ └── spring-configuration-metadata.json
└── org
└── springframework
└── boot
└── loader [19 entries exceeds filelimit, not opening dir]
BOOT-INF
와 META-INF
와 jar를 시작하는 loader
디렉터리가 있다.
bootJar 태스크는 실행 가능 jar 파일 생성하는 것으로 주로 어플리케이션의 배포 등을 이 테스트를 사용하는 경우가 많다.
jar 작업은 클래스 파일을 생성한다.
jar 태스크를 실행하여 tree
명령으로 생성한 파일을 살펴본다.
생성되는 것은 {project-dir}/build/libs/
에 파일명은 {project-name}-plain.jar
% tree -L 5 --filelimit 10
.
├── META-INF
│ ├── MANIFEST.MF
│ └── spring-configuration-metadata.json
├── application.yml
├── com
│ └── devkuma
│ └── api
│ ├── DevkumaApiApplication.class
│ ├── config
│ ├── controller
│ ├── param
│ ├── service
│ └── support
└── logback-spring.xml
META-INF
와 클래스 파일만 생성되어 있다.
단독으로 응용 프로그램으로 실행할 수 없는 파일이지만, 라이브러리 등으로 배포 할 때 사용할 수 있다.
build
태스크는 두개의 jar를 생성한다.
build 태스크를 실행하면 {project-name}.jar
와 {project-name}-plain.jar
가 생성된다.
앞서 언급했듯이 응용 프로그램 배포에서는 실행 가능한 jar 파일이 필요하기 때문에 plain.jar
은 쓸모가 없다.
특별히 필요하지 않다면, build.gradle
의 설정으로 생성되지 않도록 설정해 두는 것도 좋다.
build.gradle.kts
에서 plain.jar
을 생성하지 않게 하기
tasks.getByName("jar") {
enabled = false
}
build.gradle
에서 plain.jar
을 생성하지 않게 하기
jar {
enabled = false
}
이렇게 설정해 두는 것만으로 build
태스크를 실행해도 plain.jar
는 생성되지 않는다.
그리고 jar 테스트을 실행해도 plain.jar
은 생성되지 않는다.
요약
- bootJar 태스크는 실행 가능한 jar 파일을 생성한다.
- jar 태스크는 클래스 파일을 생성한다.
- 빌드 태스크는 두 jar를 모두 생성한다.
- 일반적인 배포에서는 Executable
{project-name}.jar
를 사용한다.
응용 프로그램 배포에 jar
가 필요한 경우 bootJar
또는 build
태스크를 실행하여 jar
파일을 사용한다.