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)。

図1●LabelIndicatorの実行例
図1●LabelIndicatorの実行例