741 文字
4 分
【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プラグインです。

なお、使用している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を参照してください。

fat JARを作る#

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

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

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

Terminal window
$ ./gradlew shadowJar

確認#

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

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

Terminal window
$ 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ファイルの中身を確認してみます。

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

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

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

参考: