JREのスリム化
Dockerなどで、Javaの実行環境を小さくしたいというのはある。
そいうときに使えるのがjlink
とjdeps
(リンク先はJava 10のもの)。
精確にはjdeps
はライブラリの依存関係を調べるためのツールで、jlink
は実行環境を作るためのツール。
これらは$JAVA_HOME/bin
にある。
Arch Linuxであれば、/usr/lib/jvm/default/bin
の下にある。
この2つを使って小さなJava実行環境を作っていく。
なお、記事執筆時点でのバージョンはJava 11.0.3。
環境はArch Linuxでやってるので、当然なが他の環境では$JAVA_HOME
は違うので、
find / -iname jdeps
をシェルに実行させるなりして探して欲しい。
Javaプログラムの依存関係を調査
まず、プログラムを動かすのに必要な標準ライブラリをjdeps
で調べる。
$ jdeps --list-deps *.jar
--list-deps
はプログラムが参照しているモジュール(java.base
など)を表示するためのオプション。
得られたモジュールリスト(たとえば、プログラムがjava.base
とjava.desktop
に依存していたとする)を元に、jlink
でJavaの実行環境をminjre
下に作成する。
$ jlink --compress=2 --module-path $JAVA_HOME/jmods --add-modules java.base,java.desktop --output minjre
モジュールの情報は.jmod
拡張子がついたファイルに収められていて、基本的なモジュールについての情報を収めたファイルは$JAVA_HOME/jmods/
の下にある。
絶対に必要なオプションが--module-path
と--add-modules
の2つで、
--module-path modulepath
: モジュールの情報が収められたファイルのあるディレクトリmodulepath
を使用するモジュールパスとして設定--add-modules module[,module..]
: JREに追加したいモジュールmodule
を設定。複数個指定する場合はmodule1,module2
のようにカンマ(,
)区切り
を指定しなければならない。 また、
--output output_dir
: 出力先output_dir
を設定。指定したディレクトリの下にJRE環境ができる--compress=n
: 圧縮するかどうかを設定する0
: 圧縮なし1
: 定数文字列を共有させる2
: ZIPによる圧縮
は必要あれば設定して欲しい。
以上で、最小限のJRE環境を作ることができる。
自分で試したときはjava.base
とjava.xml
、それにjava.naming
をcompress=2
でバージョンがJava 11で作成したが、JREの環境自体は52MB程になった。
標準だと245MBくらいなので、大分小さい環境ができた。