第3章 モジュラーアプリケーション用のカスタム Java ランタイム環境の作成
jlink
ツールを使用して、モジュラーアプリケーションからカスタム Java ランタイム環境を作成できます。
前提条件
Red Hat ビルドの OpenJDK 11 をインストールします。
注記移植可能な tarball を Jlink のランタイムのベースとして使用することが推奨されます。
手順
Logger クラスを使用して、単純な Hello World アプリケーションを作成します。
jdk-
11 フォルダーで利用可能な OpenJDK 11 のベース Red Hat ビルドがあります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls jdk-11 ./jdk-11/bin/java -version
$ 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)
アプリケーションのディレクトリーを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mkdir -p hello-example/sample
$ mkdir -p hello-example/sample
以下の内容を含む
hello-example/sample/HelloWorld.java
ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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!"); } }
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
ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow module sample { requires java.logging; }
module sample { requires java.logging; }
アプリケーションをコンパイルします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./jdk-11/bin/javac -d example $(find hello-example -name \*.java)
$ ./jdk-11/bin/javac -d example $(find hello-example -name \*.java)
カスタム JRE なしでアプリケーションを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./jdk-11/bin/java -cp example sample.HelloWorld
$ ./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 を検査し、アプリケーションの必須でない多くのモジュールを表示できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow du -sh jdk-11/
$ du -sh jdk-11/ 313M jdk-11/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./jdk-11/bin/java --list-modules
$ ./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 依存関係のみでアプリケーションを実行するのに役立ちます。
アプリケーションモジュールを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ 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 を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./jdk-11/bin/jlink --launcher hello=sample/sample.HelloWorld --module-path sample-module --add-modules sample --output custom-runtime
$ ./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 の分数だけを維持していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow du -sh custom-runtime ./custom-runtime/bin/java --list-modules
$ 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 ランタイムイメージに縮小されます。
hello
launcher を使用してアプリケーションを起動します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./custom-runtime/bin/hello
$ ./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