第3章 モジュラーアプリケーション用のカスタム Java ランタイム環境の作成

jlink ツールを使用して、モジュラーアプリケーションからカスタム Java ランタイム環境を作成できます。

前提条件

手順

  1. Logger クラスを使用して、単純な Hello World アプリケーションを作成します。

    1. jdk- 11 フォルダーで利用可能な OpenJDK 11 のベース Red Hat ビルドがあります。

      $ ls jdk-11
      bin  conf  demo  include  jmods  legal  lib  man  NEWS  release
      $ ./jdk-11/bin/java -version
      openjdk version "11.0.10" 2021-01-19 LTS
      OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS)
      OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode)
    2. アプリケーションのディレクトリーを作成します。

      $ mkdir -p hello-example/sample
    3. 以下の内容を含む hello-example/sample/HelloWorld.java ファイルを作成します。

      package sample;
      
      import java.util.logging.Logger;
      
      public class HelloWorld {
          private static final Logger LOG = Logger.getLogger(HelloWorld.class.getName());
          public static void main(String[] args) {
              LOG.info("Hello World!");
          }
      }
    4. 以下の内容を含む hello-example/module-info.java ファイルを作成します。

      module sample
      {
          requires java.logging;
      }
    5. アプリケーションをコンパイルします。

      $ ./jdk-11/bin/javac -d example $(find hello-example -name \*.java)
    6. カスタム JRE なしでアプリケーションを実行します。

      $ ./jdk-11/bin/java -cp example sample.HelloWorld
      Mar 09, 2021 10:48:59 AM sample.HelloWorld main
      INFO: Hello World!

      この場合、OpenJDK のベース Red Hat ビルドの OpenJDK は、1 つのクラスを実行するために 311 MB を取得します。

    7. (オプション) Red Hat build of OpenJDK を検査し、アプリケーションの必須でない多くのモジュールを表示できます。

      $ du -sh jdk-11/
      313M	jdk-11/
      $ ./jdk-11/bin/java --list-modules
      java.base@11.0.10
      java.compiler@11.0.10
      java.datatransfer@11.0.10
      java.desktop@11.0.10
      java.instrument@11.0.10
      java.logging@11.0.10
      java.management@11.0.10
      java.management.rmi@11.0.10
      java.naming@11.0.10
      java.net.http@11.0.10
      java.prefs@11.0.10
      java.rmi@11.0.10
      java.scripting@11.0.10
      java.se@11.0.10
      java.security.jgss@11.0.10
      java.security.sasl@11.0.10
      java.smartcardio@11.0.10
      java.sql@11.0.10
      java.sql.rowset@11.0.10
      java.transaction.xa@11.0.10
      java.xml@11.0.10
      java.xml.crypto@11.0.10
      jdk.accessibility@11.0.10
      jdk.aot@11.0.10
      jdk.attach@11.0.10
      jdk.charsets@11.0.10
      jdk.compiler@11.0.10
      jdk.crypto.cryptoki@11.0.10
      jdk.crypto.ec@11.0.10
      jdk.dynalink@11.0.10
      jdk.editpad@11.0.10
      jdk.hotspot.agent@11.0.10
      jdk.httpserver@11.0.10
      jdk.internal.ed@11.0.10
      jdk.internal.jvmstat@11.0.10
      jdk.internal.le@11.0.10
      jdk.internal.opt@11.0.10
      jdk.internal.vm.ci@11.0.10
      jdk.internal.vm.compiler@11.0.10
      jdk.internal.vm.compiler.management@11.0.10
      jdk.jartool@11.0.10
      jdk.javadoc@11.0.10
      jdk.jcmd@11.0.10
      jdk.jconsole@11.0.10
      jdk.jdeps@11.0.10
      jdk.jdi@11.0.10
      jdk.jdwp.agent@11.0.10
      jdk.jfr@11.0.10
      jdk.jlink@11.0.10
      jdk.jshell@11.0.10
      jdk.jsobject@11.0.10
      jdk.jstatd@11.0.10
      jdk.localedata@11.0.10
      jdk.management@11.0.10
      jdk.management.agent@11.0.10
      jdk.management.jfr@11.0.10
      jdk.naming.dns@11.0.10
      jdk.naming.ldap@11.0.10
      jdk.naming.rmi@11.0.10
      jdk.net@11.0.10
      jdk.pack@11.0.10
      jdk.rmic@11.0.10
      jdk.scripting.nashorn@11.0.10
      jdk.scripting.nashorn.shell@11.0.10
      jdk.sctp@11.0.10
      jdk.security.auth@11.0.10
      jdk.security.jgss@11.0.10
      jdk.unsupported@11.0.10
      jdk.unsupported.desktop@11.0.10
      jdk.xml.dom@11.0.10
      jdk.zipfs@11.0.10

      サンプル Hello World アプリケーションには、非常にいくつかの依存関係があります。jlink を使用して、アプリケーションのカスタムランタイムイメージを作成できます。これらのイメージは、必要な Red Hat ビルドの OpenJDK 依存関係のみでアプリケーションを実行するのに役立ちます。

  2. アプリケーションモジュールを作成します。

    $ mkdir sample-module
    $ ./jdk-11/bin/jmod create --class-path example/ --main-class sample.HelloWorld --module-version 1.0.0 -p example sample-module/hello.jmod
  3. 必要なモジュールとアプリケーションのカスタムアプリケーションランチャーを使用して、カスタム JRE を作成します。

    $ ./jdk-11/bin/jlink --launcher hello=sample/sample.HelloWorld --module-path sample-module --add-modules sample --output custom-runtime
  4. 生成したカスタム JRE のモジュールをリスト表示します。

    元の Red Hat build of OpenJDK の分数だけを維持していることを確認します。

    $ du -sh custom-runtime
    50M	custom-runtime/
    $ ./custom-runtime/bin/java --list-modules
    java.base@11.0.10
    java.logging@11.0.10
    sample@1.0.0
    注記

    カスタムの java ランタイムイメージのサイズは、313M ランタイムイメージから 50M ランタイムイメージに縮小されます。

  5. hello launcher を使用してアプリケーションを起動します。

    $ ./custom-runtime/bin/hello
    Jan 14, 2021 12:13:26 PM HelloWorld main
    INFO: Hello World!

    サンプルアプリケーションと生成された JRE には java.basejava.logging、および sample モジュール以外の他の依存関係がありません。

    custom-runtime でカスタムランタイムにバンドルされたアプリケーションを配布できます。これにはアプリケーションが含まれます。

注記

ベース Red Hat build of OpenJDK のセキュリティー更新ごとに、アプリケーションのカスタム Java ランタイムイメージを再構築する必要があります。

改訂日時: 2024-05-10