次の方法で共有


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 を参照)。 この変更の一環として、開発者は、 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 ランタイムを作成できるようになりました。

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 およびその関連会社の商標または登録商標です。