次の方法で共有


Java ランタイムと jlink

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

従来、Oracle/Sun Microsystems は、Java Runtime Environment (JRE) インストーラーを提供していました。このインストーラーには、Java 仮想マシン、Java API、および OS やブラウザー固有の統合のみが含まれており、インターネットからダウンロードした Java アプリケーションを実行したり、ブラウザーを介してアプレットや Java Web Start アプリケーションを実行したりするためのものでした。

最新の Web アプリケーションとブラウザーの登場により、アプレットと Java Web Start 技術は共に非推奨になり、ブラウザーは Java プラグインをサポートしなくなりました。 コンピューターに事前にインストールされた汎用 Java Runtime Environment の必要性は、時間の経過とともに薄れていきました。 Java 9 ではアプレット API が非推奨になり (JEP 289 を参照)、Java 17 では、この API は削除対象としてマークされ、将来の Java リリースでは確実に削除されます。

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

今日の Minecraft: Java Edition は、ゲームに埋め込まれたカスタム Java ランタイムによって、何百万人もの Minecraft ユーザーにデプロイされています。 LinkedIn、Yammer、Bing、Azure などのオンライン サービスの背後では、Microsoft もこの手法を使用して何十万もの JVM をデプロイしています。

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

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

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 モジュールに依存するアプリケーション コードを実行できるようになりました。 jlink によって生成される javaruntime フォルダーの構造は 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 やその関連会社の商標または登録商標です。