jlink を使用した Java ランタイム環境のカスタマイズ

Red Hat build of OpenJDK 11

Red Hat Customer Content Services

概要

Red Hat build of OpenJDK 17 の Red Hat ビルドは、Red Hat Enterprise Linux プラットフォーム上の Red Hat 製品です。『Using jlink to customize Java ランタイムイメージ』は、Jlink の概要と、jlink を使用して Java ランタイムイメージを作成し、使用する方法を説明します。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ を参照してください。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat ドキュメントに関するご意見やご感想をお寄せください。フィードバックをお寄せいただくには、ドキュメントのテキストを強調表示し、コメントを追加できます。

このセクションでは、フィードバックの送信方法を説明します。

前提条件

  • Red Hat カスタマーポータルにログインしている。
  • Red Hat カスタマーポータルで、マルチページ HTML 形式でドキュメントを表示している。

手順

フィードバックを提供するには、以下の手順を実施します。

  1. ドキュメントの右上隅にある Feedback ボタンをクリックして、既存のフィードバックを確認します。

    注記

    フィードバック機能は、Multi-page HTML 形式でのみ有効です。

  2. フィードバックを提供するドキュメントのセクションを強調表示します。
  3. 強調表示されたテキスト近くに表示される Add Feedback ポップアップをクリックします。

    ページの右側のフィードバックセクションにテキストボックスが表示されます。

  4. テキストボックスにフィードバックを入力し、Submit をクリックします。

    ドキュメントに関する問題が作成されます。

  5. 問題を表示するには、フィードバックビューで問題トラッカーリンクをクリックします。

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

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

前提条件

手順

  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. アプリケーションをコンパイルします。

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

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

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

    6. (オプション) 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. jdeps コマンドを使用して、アプリケーションのモジュール依存関係を決定します。

    $ ./jdk-11/bin/jdeps -s ./sample/HelloWorld.class
    HelloWorld.class -> java.base
    HelloWorld.class -> java.logging
  3. アプリケーションのカスタム java ランタイムイメージをビルドします。

    $ ./jdk-11/bin/jlink --add-modules java.base,java.logging --output custom-runtime
    $ du -sh custom-runtime
    50M	custom-runtime/
    $ ./custom-runtime/bin/java --list-modules
    java.base@11.0.10
    java.logging@11.0.10
    注記

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

  4. アプリケーションの縮小ランタイムを確認できます。

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

    サンプルアプリケーションで生成された JRE には他の依存関係がありません。

    デプロイメントをカスタムランタイムと一緒に配布することができます。

注記

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

第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 ランタイムイメージを再構築する必要があります。

改訂日時: 2023-09-20

法律上の通知

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.