アプリケーションの実行時イメージを作成する
Javaのアプリケーションを配布したい場合にはJVM自体も含めて配布したいケースが多々あります。そのような場合に利用できるツールとして、Java 9では、jlinkというツールが提供されました。
似たケースとして、Java 8でもアプリケーションを配布するためにjavapackagerというツールが用意されています。こちらのツールはインストーラーも含めて作成するツールですが、jlinkは実行イメージを作成します。
インストーラーまでは提供していないので、インストーラーが必要ない方やzipやtarなどアーカイブ形式で十分な方にはよりよいツールといえます。
また、IoT機器への組み込みや、Dockerといったコンテナ上でJavaを実行する際にも適した形式といえます。実際に、図3のように用意されたファイルがある場合の実行イメージを作成する方法を紹介します。
また、サンプルではこのアプリケーション用jarファイルには、先ほど作成したMulti-Release Jar Filesの紹介で作成したmrjar.jarファイルと、Appというクラスをコンパイルして作成したjarファイルが用意されていることを前提とします。
すでにjarファイルがある前提なのは、jlinkにはclassファイルではなく、モジュール対応されたjarファイルが必要なためです。
jarファイルを作成する行程の説明は省略しますが、実際の作業はこれまでの記事やリファレンス等を参考にしてください。または、サンプルコード内にはgradleにてjarファイルを作成するための設定ファイルを用意しているので、そちらを利用してください。
リスト7がjlinkコマンドを実行した例です。
$JAVA_HOME/bin/jlink \ --module-path $JAVA_HOME/jmods:libs:build/libs \ (1) --add-modules com.coltware.main \ (2) --launcher app=com.coltware.main/com.coltware.main.App \ (3) --output dist (4)
(1)ではモジュールパスを指定します。javaコマンドと異なり、$JAVA_HOME/jmodsというJava内部で管理されているモジュールファイルへのパスと、用意したjarファイルが保存されているパスを指定します。
(2)では、利用するモジュール名を指定します。こちらは、javaコマンドを実行するときの指定と同じです。また、(3)の"--launcher"指定は、実行ファイルと実行するモジュール、さらにそのクラスを指定します。少々わかりにくいのですが、後述する実行コマンドの作成を指定しています。そして、(4)では実行イメージの出力パスを指定します。
そして、このコマンドにて出力されたイメージでプログラムを実行するにはリスト8のコマンドを実行します。
cd dist ./bin/app
このappというコマンドが(3)にて指定したappの部分に相当します。そして、このappファイルの内容がリスト9になります。
#!/bin/sh JLINK_VM_OPTIONS= DIR=`dirname $0` $DIR/java $JLINK_VM_OPTIONS -m com.coltware.main/com.coltware.main.App $@
コードを見ると単純にjavaコマンドを実行していることがわかりますが、モジュール対応されたにもかかわらずモジュール指定が一切されていないことがわかります。
これは、実行イメージの中に指定したモジュールjarファイルが、Java内部のモジュールと同様の位置づけですでに取り込まれているためです。
したがって、実行イメージ内には作成したjarファイルが見つかりません。そのため、ファイル名を見ただけではどのようなモジュールが含まれているかがわかりにくくなってしまいます。実際に取り込まれたモジュール一覧を参照するためには、リスト10のようにjavaコマンドの--list-modulesオプションを使って実行することで確認できます。
$cd dist $./bin/java --list-modules com.coltware.main com.coltware.mrlib java.base@9