jlink を使用した Java ランタイム環境のカスタマイズ
概要
Red Hat build of OpenJDK ドキュメントへのフィードバック リンクのコピーリンクがクリップボードにコピーされました!
エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 次のリンクをクリックして チケットを作成します。
- Summary に課題の簡単な説明を入力します。
- Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL を含めてください。
- Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。
多様性を受け入れるオープンソースの強化 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。
第1章 jlink の概要 リンクのコピーリンクがクリップボードにコピーされました!
Jlink は、JRE (カスタムの Java ランタイム環境) の生成に使用される Java コマンドラインツールです。カスタマイズした JRE を使用して Java アプリケーションを実行できます。
jlink を使用して、関連するクラスファイルのみが含まれるカスタムのランタイム環境を作成できます。
第2章 モジュール以外のアプリケーション用のカスタム Java ランタイム環境の作成 リンクのコピーリンクがクリップボードにコピーされました!
jlink ツールを使用して、非モジュールアプリケーションからカスタム Java ランタイム環境 (JRE) を作成できます。
前提条件
Red Hat ビルドの OpenJDK 11 をインストールします。
注記移植可能な tarball を jlink のランタイムのベースとして使用することが推奨されます。
手順
Logger クラスを使用して、単純な Hello World アプリケーションを作成します。
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)アプリケーションのディレクトリーを作成します。
$ mkdir -p hello-example/sample以下の内容を含む
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!"); } }アプリケーションをコンパイルします。
$ ./jdk-11/bin/javac -d . $(find hello-example -name \*.java)カスタム 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 を取得します。
(オプション) 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 依存関係のみでアプリケーションを実行するのに役立ちます。
jdepsコマンドを使用して、アプリケーションのモジュール依存関係を決定します。$ ./jdk-11/bin/jdeps -s ./sample/HelloWorld.class HelloWorld.class -> java.base HelloWorld.class -> java.loggingアプリケーションのカスタム 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 ランタイムイメージに縮小されます。
アプリケーションの縮小ランタイムを確認できます。
$ ./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 ランタイム環境を作成できます。
前提条件
Red Hat ビルドの OpenJDK 11 をインストールします。
注記移植可能な tarball を Jlink のランタイムのベースとして使用することが推奨されます。
手順
Logger クラスを使用して、単純な Hello World アプリケーションを作成します。
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)アプリケーションのディレクトリーを作成します。
$ mkdir -p hello-example/sample以下の内容を含む
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!"); } }以下の内容を含む
hello-example/module-info.javaファイルを作成します。module sample { requires java.logging; }アプリケーションをコンパイルします。
$ ./jdk-11/bin/javac -d example $(find hello-example -name \*.java)カスタム 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 を取得します。
(オプション) 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 依存関係のみでアプリケーションを実行するのに役立ちます。
アプリケーションモジュールを作成します。
$ 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必要なモジュールとアプリケーションのカスタムアプリケーションランチャーを使用して、カスタム JRE を作成します。
$ ./jdk-11/bin/jlink --launcher hello=sample/sample.HelloWorld --module-path sample-module --add-modules sample --output custom-runtime生成したカスタム 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 ランタイムイメージに縮小されます。
hellolauncher を使用してアプリケーションを起動します。$ ./custom-runtime/bin/hello Jan 14, 2021 12:13:26 PM HelloWorld main INFO: Hello World!サンプルアプリケーションと生成された JRE には
java.base、java.logging、およびsampleモジュール以外の他の依存関係がありません。custom-runtimeでカスタムランタイムにバンドルされたアプリケーションを配布できます。これにはアプリケーションが含まれます。
ベース Red Hat build of OpenJDK のセキュリティー更新ごとに、アプリケーションのカスタム Java ランタイムイメージを再構築する必要があります。
改訂日時: 2024-05-10