3か月にわたってProject Jigsawを紹介してきましたが、今回が最終回です。今まではモジュールの作成や使い方を主に説明してきましたが、今回はちょっと違う観点からProject Jigsawを取り上げます。
これまでProject Jigsawで使用するツールとして、依存性を調べるjdepsコマンドを紹介しました。これ以外に、Project Jigsawではもう1つツールを提供しています。
それが今回紹介するjlinkコマンドです。jlinkコマンドを使うと、必要なモジュールだけをまとめたカスタムJREを作成できるのです。また、記事の後半ではツールのProject Jigsaw対応を紹介します。
jlinkコマンドとは
Project Jigsawを使用すれば、アプリケーションの実行に必要最低限のモジュールだけをロードできます。使用しないモジュールは必要ないので、実行環境であるJREから外してしまっても問題はないはずです。つまり、JREのサブセット化です。
JREのサブセットといえば、Java SE 8でも提供されているのをご存じでしょうか。組み込み機器向けのJava SEとして提供されているCompact Profileが、JREのサブセットです。Compact Profileは1から3までの3種類が存在し、Compact Profile 1が最も小さなJREとなっています。
Compact Profileを作成するにはAPIの整理を行わなくてはなりません。Project Jigsawで標準APIをモジュール化するにも、APIの整理が必要です。ということは、Compact Profileの策定は、Project Jigsawの活動の一環と考えることもできます。
jlinkコマンドを使用すると、Compact ProfileのようなJREのサブセットを作成できます。
jlinkコマンドの使い方を示すために、簡単なサンプルを用意しましょう。ここでは、本連載の「Java SE 9、Project Jigsawの標準モジュールと依存性の記述」で使用した、JavaFXでラベルを表示するサンプルを使用します。
このサンプルは2つのモジュールから構成されます。一方がラベルオブジェクトを作成するファクトリのモジュール、他方がラベルを表示するモジュールです。ラベルを作成するモジュールの名前はnet.javainthebox.labelとします。モジュール定義をリスト1に示しました。
リスト1●net.javainthebox.labelモジュールの定義
module net.javainthebox.label {
requires javafx.graphics;
requires public javafx.controls;
exports net.javainthebox.label;
}
このnet.javainthebox.labelモジュールを使用するのが、net.javainthebox.labelindicatorモジュールです。net.javainthebox.labelindicatorモジュールのモジュール定義をリスト2に示しました。
リスト2●net.javainthebox.labelindicatorモジュールの定義
module net.javainthebox.labelindicator {
requires javafx.graphics;
requires net.javainthebox.label;
exports net.javainthebox.labelindicator;
}
net.javainthebox.labelindicatorモジュールのメインクラスはLabelIndicatorクラスです。これらのモジュールはそれぞれLabelFactory.jarファイル、LabelIndicator.jarファイルとし、modsディレクトリに配置しました。まず実行できるかどうかを試してみましょう。
C:\demo>java -mp mods -m net.javainthebox.labelindicator/net.javainthebox.labelindicator.LabelIndicator
正しく実行できれば、"JavaFX"のラベルが貼られたウインドウが表示されます(図1)。