Gradleタスクの bootJarとjar で生成されるjarの違いをちゃんと理解してなかったので備忘録として残しておく
「bootJar」タスク は 実行可能なjarファイルが生成される
bootJarタスクを実行してtreeコマンドで生成したファイルを見てみる。
生成されるのは build/libs/ 以下でファイル名は「モジュール名.jar」
/ treeコマンドを使いたいので homebrewでinstallしておく
$ brew install tree
$ tree -l --filelimit 4
.
├── BOOT-INF
│ ├── classes
│ │ ├── META-INF
│ │ │ └── moge-api.kotlin_module
│ │ ├── application.yml
│ │ └── com
│ │ └── moge
│ │ └── sample [5 entries exceeds filelimit, not opening dir]
│ ├── classpath.idx
│ ├── layers.idx
│ └── lib [39 entries exceeds filelimit, not opening dir]
├── META-INF
│ └── MANIFEST.MF
└── org
└── springframework
└── boot
└── loader [19 entries exceeds filelimit, not opening dir]
BOOT-INFとMETA-INFとjarを起動するloaderのディレクトリが存在する。
bootJarタスク = 実行可能jarファイル 生成ということで普段のアプリケーションのデプロイ等ではこっちを使うことが多いはず。
「jar」タスク は クラスファイルが生成される
jarタスクを実行してtreeコマンドで生成したファイルを見てみる。
生成されるのは build/libs/ 以下でファイル名は「モジュール名-plain.jar」
$ tree -l --filelimit 4
.
├── META-INF
│ ├── MANIFEST.MF
│ └── linkage-tenants-api.kotlin_module
├── application.yml
└── com
└── moge
└── sample [5 entries exceeds filelimit, not opening dir]
META-INFとクラスファイルのみ生成される。
単体のアプリケーションとして実行できないファイルになるが、ライブラリ等として配布する時に使えたりする。
「build」 タスクでは両方の jar が生成される
buildタスクを実行すると「モジュール名.jar」と「モジュール名-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」 タスクでは両方の jar を生成
- 一般的なデプロイではExecutableな「モジュール名.jar」を使う。
アプリケーションデプロイ用のjarが必要な時は 「bootJar」タスク または「build」タスクを実行してjarファイルを使用する。
【補足】jar ファイルの解凍方法
macでjarファイルの解答は The Unarchiver というアプリを使いました。
https://apps.apple.com/jp/app/the-unarchiver/id425424353?mt=12
環境
- Spring Boot 2.6.5
- Gradle 7.3.3


コメント