【Gradle】依存ライブラリをすべて含めたJAR(fat JAR)を作成する

Javaで開発したコードをPaaSとかにデプロイするためには、依存しているライブラリをすべてJARの中に含めたJAR (=far JAR)を作ってそれをデプロイしないと動きません。

新規にJavaでサービスを作ったのですが、fat JARという概念を知らずにローカルでは動くのにデプロイしたら動かないなーとなってハマってしまったので、fat JARの作り方をメモしておきます。

fat JARの作り方

build.gradleの修正

まずはbuild.gradleを修正します。build.gradleのもともとのpluginsの設定がこうなっているところに1行追加して

plugins {
    id 'java'
}

↓のようにします。build.gradleの修正はこれだけです。

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.+'
}

追加したのはshadowというプラグインで、fat JARを簡単に作成するためのGradleプラグインです。

VuePress

なお、使用しているGradleのバージョンによってpluginsに指定するshadowのバージョンを使い分ける必要があります。

Gradleのそれぞれのバージョンに対応しているshadowのバージョンは次の通りです。自分はGradle 7.1を利用しているので、7系の最新バージョンが入るように7.+と記述しています。

Gradleのバージョンshadowのバージョン
5.x5.2.0 – 6.0.0
6.x5.2.0 – 6.1.0
7.x7.0.0以上

最新のバージョンの対応表はshadowのGithubのREADMEを参照してください。

GitHub - johnrengelman/shadow: Gradle plugin to create fat/uber JARs, apply file transforms, and relocate packages for applications and libraries. Gradle version of Maven's Shade plugin.
Gradle plugin to create fat/uber JARs, apply file transforms, and relocate packages for applications and libraries. Grad...

fat JARを作る

さて、あとはfat JARファイルを作成するだけです。

IntelliJを使っている場合は次の画像のようにGradleのタスクの中にshadowJarというタスクが現れているはずなので、それを実行すれば依存関係全部入りのfat JARファイルを作成できます。build/libs以下にJARファイルが生成されているはずです。

IDEでなくコマンドで実行したい場合は以下のコマンドで作成できます。

$ ./gradlew shadowJar

確認

最後に、本当に依存関係が含まれたJARができたのか確認してみます。

まずは生成されたJARファイルの確認です。ファイルサイズが大きいので色々含まれていそうです。

$ ls -lh build/libs/javacv_url_image_loader-1.0-SNAPSHOT-all.jar
-rw-r--r--  1 user  staff   779M Nov  7 03:49 build/libs/javacv_url_image_loader-1.0-SNAPSHOT-all.jar

なお今回はJavaCVというどでかいライブラリを使ったのでこんなに大きなJARになりましたが、大体はもっと小さいと思います。

もうちょっとちゃんと確認したいので、JARファイルの中身を確認してみます。

$ jar tf build/libs/javacv_url_image_loader-1.0-SNAPSHOT-all.jar
META-INF/
...
org/bytedeco/javacv/
...

無事依存ライブラリの情報が作成したJARに含まれていました。

これでローカル環境以外でも動く依存関係全部入りのfat JARファイルを作成できるようになりました。

参考:

Gradle: 依存ライブラリ入りのjarを作る - Qiita
Gradleにはjarを生成するjarタスクが存在し、jarファイルを作ることができるが、依存ライブラリは含まれないのでそれ単体では実行できない。java -jar ./build/libs/he…

コメント