Gradle "bootJar"와 "jar" 태스크로 생성되는 jar 파일의 차이점

Gradle 태스크의 bootJar와 jar로 생성되는 jar의 차이를 설명한다.

bootJar,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-INFMETA-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 파일을 사용한다.




최종 수정 : 2024-03-09