種明かし編:SpringBootのJarのサイズをめっちゃ小さくする!

昨日書いたやつの種明かし編。

bufferings.hatenablog.com

コードはこちら

github.com

## 答えから

Spring Boot Thin Launcherを使った。

github.com

## 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には何も入ってないのでサイズは小さい。

## じゃあ依存関係のライブラリーはどうなるの?

いい質問!

起動時にダウンロードされる。こんな流れ。

  1. ThinJarWrapperがランチャーをダウンロードする
  2. ランチャーがpom.xmlを読み込んで依存ライブラリーをダウンロードする
  3. アプリケーションを起動する

## てことは起動は遅い?

そう。

初回起動時にランチャーとライブラリーを.m2ディレクトリにダウンロードするから遅い。でも2回目以降はもうダウンロードしなくてもいいから速い。

それに既にmavenでライブラリーがダウンロードされてる場合はそれが利用されるのでダウンロードしなくてすむ。

## でもFat Jarと比べて何が嬉しいの?

それな。

どうなんだろうなー。僕は正直まだ理解できてない。ぱっと思いつくので言うと、Dockerのレイヤーにライブラリーを閉じ込めてしまえば、依存関係が変わらない限り再利用できるなぁ、って思った。それはまた次の機会に書こうと思う。

2018-10-03追記

書いた

bufferings.hatenablog.com