バージョン管理された人

subversionで管理されてます

JREのスリム化

Dockerなどで、Javaの実行環境を小さくしたいというのはある。 そいうときに使えるのがjlinkjdeps (リンク先は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.basejava.desktopに依存していたとする)を元に、jlinkJavaの実行環境を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.basejava.xml、それにjava.namingcompress=2でバージョンがJava 11で作成したが、JREの環境自体は52MB程になった。 標準だと245MBくらいなので、大分小さい環境ができた。