Java 9は、Project Jigsawでモジュラーランタイムイメージのアイデアを導入し、Javaランタイムをモノリシックアーティファクトとして出荷する問題を公式に解決しました。モノリシックランタイムイメージは、メモリ使用量が多いだけでなく、その上で実行されているアプリケーションの全体的なパフォーマンスを低下させました。これで、JREで実行されるアプリケーションの個々のニーズに基づいて、カスタマイズされたJREのサブセットをパックし、効率の多様性を高めることができます。この記事では、Java9で導入されたカスタムランタイムイメージのこの機能を全体的に見ていきます。
概要
Java9でモジュラーランタイムイメージを作成するというアイデアの影響は非常に大きいです。それは、それが実行されるプラットフォームから直接、カスタムビルドされたアプリケーションへの扉を開きます。 Javaプラットフォームは、新しいバージョンごとに機能が向上しています。ある時点でランタイムがモノリシックアーティファクトになり、メモリとパフォーマンスに大きな打撃を与えることは驚くべきことではありません。このため、開発者は長い間この問題から抜け出す方法を求めてきました。また、ほとんどのプログラムはJavaプラットフォーム全体を使用していません。プログラムのパフォーマンスとメモリ使用量を最適化できるのであれば、プログラムを実行するプラットフォームもカスタマイズできないのはなぜですか。 Java 8は最初の一歩を踏み出し、コンパクトプロファイルを使用してその一部を実装しようとしました。 。 Java 9はそれを前進させ、コンパクトプロファイルの制約なしにランタイムイメージをカスタム作成する方法を実装しました。 課せられる。ランタイムイメージのパッケージ化では、全体的なアプローチを採用しました。プラットフォーム自体は、この機能を有効にするためにモジュール化されています。モジュールにパッケージ化されたアプリケーションコードは、アプリケーションで使用されるプラットフォームモジュールのみを含むカスタムランタイムイメージとともに出荷できます。したがって、アプリケーションプログラムは、カスタムJREを含む単一のバンドルされたアーティファクトにすることができます。これは確かにパフォーマンスを活用し、より少ないメモリフットプリントで起動時間を許可します。アプリケーションがクラウドで実行されている場合、これらはネットワークの過負荷とダウンロード時間を大幅に削減します。
コンパクトプロファイル
Java9はコンパクトプロファイルの概念を超えましたが Java 8で導入されたものは、到達したマイルストーンを理解して評価するのに役立つことがよくあります。ある意味で、Java 9はそのアイデアを取り入れ、コンパクトプロファイルの概念をアップグレードしました。 より全体的な方法で。
コンパクトプロファイル Javaランタイムの静的サイズを削減できるJavaSEプラットフォームAPIのサブセットを定義します。このアイデアは基本的に、組み込みデバイスなど、ストレージ容量が小さいリソースに制約のあるデバイスでの作業を対象としています。 compact1と呼ばれる基本的に3つのプロファイルがあります 、 compact2 、および compact3 。番号の大きいプロファイルはそれぞれ、番号の小さいプロファイルのスーパーセットです。これは、 compact1 compact2の適切なサブセットです 、 compact2 compact3の適切なサブセットです 、および compact3 は、フルスタックのJava 8SEAPIの適切なサブセットです。
参照:
- コンパクトプロファイル、JavaSE8ドキュメント
- Java SEEmbedded8コンパクトプロファイルの概要
- Java8コンパクトプロファイルの概要
JIMAGEの紹介
JIMAGEは、カスタムランタイムイメージを保存するためにJava9で導入された特別なファイル形式です。このファイル形式は、パフォーマンスとストレージ用に最適化されています。ファイル形式は基本的に、JDKリソース、クラス、およびモジュールのコンテナーとして機能し、それらにインデックスを付けて、迅速な検索とより高速なクラスのロードを実現します。 JARやJMODなどの他のファイル形式とは異なり、JIMAGEは、カスタムランタイムイメージを作成する場合を除いて、JDK内部に関連しているため、開発者が使用することはめったにありません。クラスの読み込みは、JIMAGEよりもJARまたはJMODの方が、そのために特別に最適化されているため、高速です。また、JIMAGEは実行時にのみ使用できます。 JIMAGEはまだ初期の段階です。利用可能な開発者情報はほとんどありません。おそらくもっと後で公開されるでしょう。
カスタム画像の作成
Java9はjlinkを提供します プラットフォーム固有のランタイムイメージを作成するためのツール。カスタムイメージには、アプリケーション固有のモジュールとプラットフォームに必要なモジュールが含まれています。ランタイムイメージ(別名JRE)のサイズが最小限に縮小されているため、JREとともにアプリケーションイメージも最小限に抑えられます。 JREは、プログラムとともに単一の配信単位としてバンドルされています。 jlink ツールは/binにあります JDK9のディレクトリ インストールされたディレクトリ。要件に応じて使用できるこのツールに関連付けられている利用可能ないくつかのオプションがあります。説明は、 –helpを使用して取得できます。 jlinkで利用可能なオプション 指図。ここでは、便宜上抽出されています。または、 jlink –helpと入力することもできます。 コマンドラインで次のリストを取得します。
使用法:
jlink <options> --module-path <modulepath> --add-modules <module>[,<module>...]
オプション | 説明 |
–add-modules | 解決するルートモジュール |
–bind-services | サービスプロバイダーモジュールとその依存関係のリンク |
-c、–compress =<0 | 1 | 2>
–disable-plugin
–endian | リソースの圧縮を有効にする: レベル0:圧縮なし レベル1:一定の文字列共有 レベル2:ZIP 上記のプラグインを無効にします 生成されたjimageのバイト順序(デフォルト:ネイティブ) |
-h、–help –ignore-signing-information
–launcher
–limit-modules –list-plug-ins | このヘルプメッセージを印刷する 署名されたモジュラーJARがイメージにリンクされている場合の致命的なエラーを抑制します。署名されたモジュラーJARの署名関連ファイルは、ランタイムイメージにコピーされません。 モジュールとメインクラス(指定されている場合)に指定された名前のランチャーコマンドを追加します。 観察可能なモジュールの世界を制限します。 利用可能なプラグインを一覧表示します。 |
-p、–module-path –no-header-files –マニュアルページなし –出力<パス> –save-opts<ファイル名> | モジュールパス インクルードヘッダーファイルを除外する マニュアルページを除外する 出力パスの場所 指定されたファイルにjlinkオプションを保存します |
-G、–strip-debug
–suggest-providers [ | デバッグ情報を削除する モジュールパスから特定のサービスタイプを実装するプロバイダーを提案する |
-v、–verbose –バージョン @<ファイル名> | 詳細なトレースを有効にする バージョン情報 ファイルからオプションを読み取る |
簡単な例
ここでは、Javaアプリケーションのランタイムイメージを作成する方法の最初から最後まで、非常に単純なプログラムについて説明します。 JDK9 が正しくインストールされ、 PATH およびJAVA_HOME 環境変数は適切に設定されています。私の場合、次のようにインストールおよび設定されています(Linuxプラットフォームの場合):
- JDK9 インストールされたディレクトリ/usr / lib / jvm / java-9-oracle
- パス / usr / lib / jvm / java-9-oracle / binに設定されます
- JAVA_HOME / usr / lib / jvm / java-9-oracleに設定されています
ステップ1
/ Home / SampleProjectという名前のディレクトリを作成します およびsrc その中のディレクトリ(たとえば、 / Home / SampleProject / src 。
ステップ2
org.app.testという名前のディレクトリを作成します src内 ディレクトリ(例として、 /Home/SampleProject/src/org.app.test 。
ステップ3
さて、 org.app.testの内部 ディレクトリで、 module-info.javaという名前のファイルを作成します 。そして、次の内容を入力します。
module org.app.test{ requires javafx.controls; exports org.app.test; }をエクスポートします
ステップ4
次に、 org、app、testという名前のディレクトリを作成します。 1つは別の内部にあります(たとえば、 org.app.test / org / app / test )次に、 MyApplication.javaという名前のファイルを作成します。 テスト内 ディレクトリを作成し、次の内容を入力します。
package org.app.test; import javafx.application.Application; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.stage.Stage; public class MyApplication extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) throws Exception { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Congratulation!"); alert.setHeaderText("You did it. The application is running. Press OK to close"); alert.setContentText("You have successfully created a custom image"); alert.showAndWait().ifPresent(rs -> { if (rs == ButtonType.OK) { System.out.println("Pressed OK."); } }); } }
ステップ5
/ Home / SampleProject / modsを作成します ディレクトリ。ここでは、コンパイルされたコードを保存します。ソースコードを次のようにコンパイルします。現在の作業ディレクトリは/ Home / SampleProject 。
javac -d mods --module-source-path src src/org.app.test/module-info.java src/org.app.test/org/app/test/MyApplication.java
ステップ6
それでは、JARファイルを作成して libに保存しましょう。 ディレクトリ( / Home / SampleProject / lib など) )次のように:
jar --create --file lib/org.app.test.jar --main-class org.app.test.MyApplication -C mods/org.app.test .
ステップ7
テストするには、次のようにアプリケーションを実行します。
java --module-path lib -m org.app.test
ステップ8
それでは、JMODファイルを作成して、 jmodsに保存しましょう。 ディレクトリ(たとえば、 Home / SampleProject / jmods ):
jmod create --class-path lib/org.app.test.jar jmods/org.app.test.jmod
ステップ9
最後に、次のコマンドを使用してカスタムイメージを作成しましょう:
jlink --module-path /usr/lib/jvm/java-9-oracle/jmods/:jmods --add-modules org.app.test --launcher runapp=org.app.test --output dist
これにより、 distという名前のフォルダが作成されます これには、アプリケーションの実行に必要なものがすべて含まれています。ランチャー名がrunappとして指定されたプログラム 、 dist / binに含まれています ディレクトリ。ダブルクリックして実行します。
図1: プログラムは実行中です
それだけです。
結論
この記事で使用されている各コマンドオプションの詳細については、適切なドキュメントを参照してください。簡単なプログラムを試して、最初から最後までビルドしてください。これにより、複数のモジュールを使用したり、それらの依存関係を処理したりするなど、もう少し複雑なプログラムを試すために必要な自信が生まれます。 JDK9により、開発者は、必要なモジュールのみで満たされるランタイムバゲッジを準備できるようになりました。これは驚くべきことであり、私たちのほとんどが長い間Javaに期待していたことです。 Javaアプリケーションは、明らかにわずかな理由で運ぶ必要のある手荷物をすくめることができ、配布で最適化されたプラットフォームになることができます。