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.x | 5.2.0 – 6.0.0 |
6.x | 5.2.0 – 6.1.0 |
7.x | 7.0.0以上 |
最新のバージョンの対応表はshadowのGithubのREADMEを参照してください。
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ファイルを作成できるようになりました。
参考:
コメント