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

Gradle タスクの bootJar と jar で生成される jar の違いを説明する。

bootJar,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-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 タスクは 2 つの jar を生成する

build タスクを実行すると、{project-name}.jar{project-name}-plain.jar が生成される。

前述のとおり、アプリケーションのデプロイでは実行可能な jar ファイルが必要になるため、plain.jar は役に立たない。

特に必要でなければ、build.gradle の設定で生成されないようにしておくのもよい。

build.gradle.ktsplain.jar を生成しないようにする

tasks.getByName("jar") {
    enabled = false
}

build.gradleplain.jar を生成しないようにする

jar {
    enabled = false
}

このように設定しておくだけで、build タスクを実行しても plain.jar は生成されない。

また、jar タスクを実行しても plain.jar は生成されない。

まとめ

  • bootJar タスクは実行可能な jar ファイルを生成する。
  • jar タスクはクラスファイルを生成する。
  • build タスクは 2 つの jar をどちらも生成する。
  • 一般的なデプロイでは実行可能な {project-name}.jar を使用する。

アプリケーションのデプロイに jar が必要な場合は、bootJar または build タスクを実行して生成された jar ファイルを使用する。