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
コメント