Gradle の "bootJar" と "jar" タスクで生成される jar ファイルの違い

bootJar タスクは実行可能な jar ファイルを生成する
bootJar タスクを実行し、tree コマンドで生成されたファイルを確認する。
tree コマンドを使用するには別途インストールが必要なので、ない場合は Homebrew でインストールする。
$ 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 タスクは 2 つの 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タスクはクラスファイルを生成する。- build タスクは 2 つの jar をどちらも生成する。
- 一般的なデプロイでは実行可能な
{project-name}.jarを使用する。
アプリケーションのデプロイに jar が必要な場合は、bootJar または build タスクを実行して生成された jar ファイルを使用する。