jlink を使用した Java ランタイム

Microsoft では、汎用 Java ランタイムの使用ではなく、特定のアプリケーションニーズに合わせて作成されたカスタム Java ランタイムの導入を承認し、サポートしています。 Java デプロイのこの方法により、Java ランタイムには、アプリケーションで本当に必要な Java プラットフォームの部分のみが含まれるので、クラウドベースとサーバー ベースの Java アプリケーションとデスクトップ/GUI アプリケーションの両方に対して、セキュリティが強化され、デプロイ サイズが縮小され、パフォーマンスが向上します。

従来、Oracle/Sun Microsystems では、Java 仮想マシン、Java API、OS およびブラウザー固有の統合のみを含む Java ランタイム環境 (JRE) インストーラーが生成されます。これは、インターネットからダウンロードした Java アプリケーションを実行したり、ブラウザーを介してアプレットや Java Web Start アプリケーションを実行したりするコンピューターを有効にすることを目的としていました。

最新の Web アプリケーションとブラウザーが登場すると、アプレットと Java Web Start テクノロジの両方が非推奨になり、ブラウザーは Java プラグインをサポートしなくなりました。 コンピューターに事前にインストールされた汎用 Java ランタイム環境の必要性は、残業時間の大幅な削減になりました。 Java 9 ではアプレット API が非推奨になり (JEP 289 を参照)、Java 17 では、API は削除対象としてマークされました。つまり、Java の将来のリリースで確実に削除されます。

もう 1 つの重要な変更は、Java 9 リリースで開始された Java のモジュール化です (JSR 376 を参照)。 この変更の一環として、開発者は JDK jlink で新しく追加されたコマンド ラインを使用して、アプリケーションのニーズに合わせて特別に設計されたカスタム Java ランタイムを生成できるようになりました。これは、組み込みの埋め込みランタイムとしてデプロイされ、アプリケーション コードと共にクラウド ベースのワークロードのコンテナー イメージの一部として頻繁にデプロイされます。 または GUI ベースのアプリケーションのインストーラーの一部として使用できます。

現在、Minecraft: Java Edition は、ゲーム内にカスタム Java ランタイムが埋め込まれた数百万人の Minecraft ゲーマーにデプロイされています。 LinkedIn、Yammer、Bing、Azure などのオンライン サービスの背後には、この手法を使用して数十万の JVM もデプロイされています。

カスタム Java ランタイムを作成する

Java ランタイムを作成するには、JDK 9 以降が環境にインストールされている必要があります。 最初に、Microsoft Build of OpenJDK をダウンロード して インストール します。

で必要なモジュールを識別する jdeps

Java プラットフォームがモジュールにセグメント化されました。 Java 17 の完全な一覧については、Java 17 のドキュメントを参照してください。他のバージョンの Java には新しいモジュールが含まれている場合があります。

JDK ツールjdepsを使用すると、ファイル、ディレクトリ、またはJARファイルを分析.classして、Java モジュールの依存関係、JDK 内部依存関係、および開発者が Java ランタイムを生成するのに役立つその他の有用な情報を識別できます。

$ cat HelloWorld.java
public class HelloWorld {
  public static void main(String args[]) {
    System.out.println("Hello World!");
  }
}

$ jdeps HelloWorld.class
HelloWorld.class -> java.base
   <unnamed>                                          -> java.io                                            java.base
   <unnamed>                                          -> java.lang                                          java.base

このツールjdepsは、このクラスが、およびjava.ioパッケージ内のjava.lang型にのみ依存することを示しているため、モジュールjava.baseのみが必要です。 入力としてファイルに対して同様の出力が JAR 生成されます。 必要なモジュールの一覧を使用して、Java ランタイムを作成できるようになりました。

JDK から Java ランタイムを作成するには、必要なモジュールを把握している必要があります。 それらを識別するために使用 jdeps します。 コマンド ライン ツールのjlink詳細については、ドキュメント参照してください。

例:

$ jlink \
         --add-modules java.base \
         --strip-debug \
         --no-man-pages \
         --no-header-files \
         --compress=2 \
         --output /javaruntime

これで、Java /javaruntime ランタイムを使用して、モジュールに依存 java.base するアプリケーション コードを実行できるようになりました。 生成されるjlinkフォルダーのjavaruntime構造は JDK ディレクトリ構造にjava似ています。JVM を開始するコマンド ライン ツールは、通常どおりフォルダー内./bin/にあります。 カスタム Java ランタイムに既存のアプリケーションの必要なすべてのモジュールが含まれている場合は、次の方法で JAVA_HOME参照できます。

$ /javaruntime/bin/java HelloWorld
Hello, World!

上記の例では、Windows で生成された Java ランタイムは、Windows で約 24 MB (メガバイト)を使用します。

Docker コンテナー イメージを使用して Java ランタイムを作成する

Docker マルチステージ ビルドを使用 して、イメージ ビルド の一部としてカスタム Java ランタイムを作成、使用、およびパックできます。 Docker を使用して Java ランタイムを作成する方法について説明します。

サポート技術情報

javax.net.ssl.SSLHandshakeException: 致命的なアラートを受信しました: handshake_failure

この問題を解決する方法については、Java のセキュリティと暗号化に関する記事を参照してください。

リソース

Microsoft Build of OpenJDK に関するフィードバックを提供する

Microsoft Build of OpenJDK の改善に役立つご意見、ご意見、アイデアをお寄せください。 GitHub の OpenJDK ディスカッション ページにアクセスして、フィードバックをお寄せください。

Java と OpenJDK は、Oracle やその関連会社の商標または登録商標です。