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 を参照)。 この変更の一環として、開発者は、 jlink
という JDK に新しく追加されたコマンド ラインを使用して、アプリケーションのニーズに合わせて特別に設計されたカスタム Java ランタイムを生成できるようになりました。これは、組み込みの埋め込みランタイムとしてデプロイされ、アプリケーション コードと共に、多くの場合、クラウドベースのワークロードのコンテナー イメージの一部として使用されます。 または GUI ベースのアプリケーションのインストーラーの一部として使用できます。
現在、Minecraft: Java Edition は、ゲーム内にカスタム Java ランタイムが埋め込まれた数百万人の Minecraft ゲーマーにデプロイされています。 LinkedIn、Yammer、Bing、Azure などのオンライン サービスの背後に、Microsoft はこの手法を使用して数十万の JVM をデプロイしています。
カスタム Java ランタイムを作成する
Java ランタイムを作成するには、JDK 9 以降が環境にインストールされている必要があります。 最初に、Microsoft Build of OpenJDK をダウンロードしてインストールします。
で必要なモジュールを識別する jdeps
Java プラットフォームがモジュールにセグメント化されました。 完全な一覧については、 Java 17 のドキュメント を参照してください。その他のバージョンの Java には、新しいモジュールが含まれる場合があります。
JDK ツール jdeps
を使用して、 .class
ファイル、ディレクトリ、または JAR
ファイルを分析し、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.lang
パッケージと java.io
パッケージの型にのみ依存するため、モジュール java.base
のみが必要であることを示します。
JAR
ファイルに対して同様の出力が入力として生成されます。 必要なモジュールの一覧を使用して、Java ランタイムを作成できるようになりました。
を使用して Java ランタイムを作成する jlink
JDK から Java ランタイムを作成するには、必要なモジュールを把握している必要があります。
jdeps
を使用して識別します。
jlink
コマンド ライン ツールの詳細については、ドキュメントを参照してください。
例:
$ jlink \
--add-modules java.base \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output /javaruntime
/javaruntime
にある Java ランタイムを使用して、モジュールに依存するアプリケーション コードjava.base
実行できるようになりました。
javaruntime
によって生成されるjlink
フォルダーの構造は JDK ディレクトリ構造に似ています。JVM を開始するjava
コマンド ライン ツールは、通常どおり ./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 のセキュリティと暗号化 に関する記事を参照してください。
リソース
OpenJDK の Microsoft Build に関するフィードバックの提供
OpenJDK の Microsoft Build の改善に役立てるために、ご意見、ご感想、アイデアをお寄せください。 GitHub の OpenJDK ディスカッション ページにアクセスして、フィードバックをお寄せください。
Java および OpenJDK は、Oracle およびその関連会社の商標または登録商標です。