1. 概要

jlink は、特定のアプリケーションに必要なプラットフォームモジュールのみを含むカスタムJavaランタイムイメージを生成するツールです。

このようなランタイムイメージはJREとまったく同じように機能しますが、選択したモジュールとそれらが機能するために必要な依存関係のみが含まれています。 モジュラーランタイムイメージの概念は、 JEP220で導入されました。

このチュートリアルでは、 jlink を使用してカスタムJREを作成する方法を学習します。また、モジュールがJRE内で正しく機能することを実行およびテストします。

2. カスタムJREを作成する必要があります

例を使用して、カスタムランタイムイメージの背後にある動機を理解しましょう。

簡単なモジュラーアプリケーションを作成します。 モジュール式アプリケーションの作成について詳しくは、モジュール性に関する記事を参照してください。

まず、HelloWorldクラスと対応するモジュールを作成しましょう。

public class HelloWorld {
    private static final Logger LOG = Logger.getLogger(HelloWorld.class.getName());
    public static void main(String[] args) {
        LOG.info("Hello World!");
    }
}
module jlinkModule {
    requires java.logging;
}

このプログラムを実行するには、 HelloWorld、 String Logger 、およびObjectクラスのみが必要です。

このプログラムの実行に必要なクラスは4つだけですが、プログラムで必要とされていない場合でも、JREで事前定義されたすべてのクラスも実行されます。

したがって、小さなプログラムを実行するには、完全なJREを維持する必要がありますが、これは単にメモリの浪費です。

したがって、カスタマイズされたJREは、この例を実行するための最良のオプションです。

jlink を使用すると、メモリを無駄にすることなく、使用したい関連クラスのみを含む独自の小さなJREを作成でき、その結果、パフォーマンスが向上します。

3. カスタムJavaランタイムイメージの構築

カスタムJREイメージを作成するための一連の簡単な手順を実行します。

3.1. モジュールのコンパイル

まず、コマンドラインから上記のプログラムをコンパイルしましょう。

javac -d out module-info.java
javac -d out --module-path out com\baeldung\jlink\HelloWorld.java

それでは、プログラムを実行してみましょう。

java --module-path out --module jlinkModule/com.baeldung.jlink.HelloWorld

出力は次のようになります。

Mar 13, 2019 10:15:40 AM com.baeldung.jlink.HelloWorld main
INFO: Hello World!

3.2. jdepsを使用して依存モジュールを一覧表示する

jlink を使用するには、アプリケーションが使用し、カスタムJREに含める必要があるJDKモジュールのリストを知る必要があります。

jdepsコマンドを使用して、アプリケーションで使用される依存モジュールを取得しましょう。

jdeps --module-path out -s --module jlinkModule

出力は次のようになります。

jlinkModule -> java.base
jlinkModule -> java.logging

java.base はJavaコードライブラリに必要な最小モジュールであり、 java.logging はプログラムのロガーによって使用されるため、これは理にかなっています。

3.3. jlinkを使用したカスタムJREの作成

モジュールベースのアプリケーション用のカスタムJREを作成するには、jlinkコマンドを使用できます。 基本的な構文は次のとおりです。

jlink [options] –module-path modulepath
  –add-modules module [, module…]
  --output <target-directory>

それでは、Java 11を使用して、プログラムのカスタムJREを作成しましょう。

jlink --module-path "%JAVA_HOME%\jmods";out
  --add-modules jlinkModule
  --output customjre

ここで、 –add-modules パラメーターの後の値は、jlinkにJREに含めるモジュールを指示します。

最後に、 –outputパラメータの横にあるcustomjre は、カスタムJREを生成するターゲットディレクトリを定義します。

このチュートリアルでは、Windowsシェルを使用してすべてのコマンドを実行することに注意してください。 LinuxおよびMacユーザーは、それらをわずかに調整する必要がある場合があります。

3.4. 生成された画像を使用してアプリケーションを実行する

これで、jlinkによって作成されたカスタムJREができました。

JREをテストするために、customjreディレクトリのbinフォルダー内を移動してモジュールを実行し、以下のコマンドを実行してみましょう。

java --module jlinkModule/com.baeldung.jlink.HelloWorld

この場合も、使用するWindowsシェルは、PATHに進む前に、現在のディレクトリで実行可能ファイルを探します。 カスタムJREを実際に実行するには、特別な注意を払う必要があります。 java LinuxまたはMacを使用している場合、PATHに対して解決されました。

4. ランチャースクリプトを使用したカスタムJREの作成

オプションで、実行可能なランチャースクリプトを使用してカスタムJREを作成することもできます。

このためには、 extra –launcherパラメーターを持つ jlink コマンドを実行して、モジュールとメインクラスでランチャーを作成する必要があります。

jlink --launcher customjrelauncher=jlinkModule/com.baeldung.jlink.HelloWorld
  --module-path "%JAVA_HOME%\jmods";out
  --add-modules jlinkModule
  --output customjre

これにより、 customjre /binディレクトリ内にcustomjrelauncher.batcustomjrelauncherの2つのスクリプトが生成されます。

スクリプトを実行してみましょう:

customjrelauncher.bat

そして、出力は次のようになります。

Mar 18, 2019 12:34:21 AM com.baeldung.jlink.HelloWorld main
INFO: Hello World!

5. 結論

このチュートリアルでは、モジュールに必要な最小限のファイルのみを含むjlinkを使用してカスタムのモジュラーJREを作成する方法を学習しました。 また、簡単に実行して出荷できるランチャースクリプトを使用してカスタムJREを作成する方法についても検討しました。

カスタムのモジュラーJavaランタイムイメージは強力です。 カスタムJREを作成する目的は明確です。つまり、メモリを節約し、パフォーマンスを向上させ、セキュリティと保守性を強化します。 軽量のカスタムJREを使用すると、小型デバイス用のスケーラブルなアプリケーションを作成することもできます。

このチュートリアルで使用されているコードスニペットは、Githubから入手できます。