昨日書いたやつの種明かし編。
コードはこちら
## 答えから
Spring Boot Thin Launcherを使った。
## is 何?
ライブラリーを同梱しないJarファイルを作ってくれる。
Spring BootのプラグインはFat Jarとして、全部のライブラリーが含まれた実行可能Jarを作るんだけど、このThin Launcherを使うとThin Jarとして、アプリケーションのclassファイルと、起動用のクラスファイルが1つだけ含まれたJarになる。
こんな感じ:
❯ jar tvf target/demo-thin-0.0.1-SNAPSHOT.jar 0 Sun Sep 30 22:24:16 JST 2018 META-INF/ 489 Sun Sep 30 22:24:16 JST 2018 META-INF/MANIFEST.MF 0 Sun Sep 30 22:24:16 JST 2018 org/ 0 Sun Sep 30 22:24:16 JST 2018 org/springframework/ 0 Sun Sep 30 22:24:16 JST 2018 org/springframework/boot/ 0 Sun Sep 30 22:24:16 JST 2018 org/springframework/boot/loader/ 0 Sun Sep 30 22:24:16 JST 2018 org/springframework/boot/loader/wrapper/ 11887 Thu Sep 06 14:17:14 JST 2018 org/springframework/boot/loader/wrapper/ThinJarWrapper.class 0 Sun Sep 30 22:24:16 JST 2018 lib/ 0 Sun Sep 30 22:24:16 JST 2018 lib/.empty 0 Sun Sep 30 22:24:16 JST 2018 com/ 0 Sun Sep 30 22:24:16 JST 2018 com/example/ 0 Sun Sep 30 22:24:16 JST 2018 com/example/demo/ 0 Sun Sep 30 22:24:16 JST 2018 META-INF/maven/ 0 Sun Sep 30 22:24:16 JST 2018 META-INF/maven/com.example/ 0 Sun Sep 30 22:24:16 JST 2018 META-INF/maven/com.example/demo-thin/ 0 Sun Sep 30 22:24:14 JST 2018 application.properties 733 Sun Sep 30 22:24:16 JST 2018 com/example/demo/DemoApplication.class 1984 Sun Sep 30 01:04:38 JST 2018 META-INF/maven/com.example/demo-thin/pom.xml 95 Sun Sep 30 22:24:16 JST 2018 META-INF/maven/com.example/demo-thin/pom.properties
このThinJarWrapper
が起動クラス。lib
には何も入ってないのでサイズは小さい。
## じゃあ依存関係のライブラリーはどうなるの?
いい質問!
起動時にダウンロードされる。こんな流れ。
ThinJarWrapper
がランチャーをダウンロードする- ランチャーが
pom.xml
を読み込んで依存ライブラリーをダウンロードする - アプリケーションを起動する
## てことは起動は遅い?
そう。
初回起動時にランチャーとライブラリーを.m2
ディレクトリにダウンロードするから遅い。でも2回目以降はもうダウンロードしなくてもいいから速い。
それに既にmavenでライブラリーがダウンロードされてる場合はそれが利用されるのでダウンロードしなくてすむ。
## でもFat Jarと比べて何が嬉しいの?
それな。
どうなんだろうなー。僕は正直まだ理解できてない。ぱっと思いつくので言うと、Dockerのレイヤーにライブラリーを閉じ込めてしまえば、依存関係が変わらない限り再利用できるなぁ、って思った。それはまた次の機会に書こうと思う。
2018-10-03追記
書いた