Jigsaw試行錯誤¶
JDK 9 EA¶
build 9-ea+174 でお試し¶
ソース構成は次です。
work +-- classes +-- src +-- module-info.java +-- com +-- torutk +-- hello +-- HelloApp.jar
module-info.javaの中身は次です。
module com.torutk.hello {
requires javafx.controls;
requires javafx.graphics;
exports com.torutk.hello;
}
HelloApp.jar は、JavaFXで空ウィンドウ表示を表示するだけの小さなサンプルです。
コンパイル¶
work$ javac -d classes --source-path src module-info.java com/torutk/hello/HelloApp.java javac: ファイルが見つかりません: module-info.java
あれ、エラーだ。よく考えれば--source-pathオプションはコンパイル対象ソースコードの中で参照されている型のソースコードを検索するときの基点となる場所を指定するものだから、javacのコマンドラインオプションに直に指定するコンパイル対象ソースファイルのパスには影響しないのですね。
work> javac -d classes --source-path src src\module-info.java src\com\torutk\hello\HelloApp.java
これならコンパイルできました。でも--souce-pathを指定する意味はあるのかな。
work> javac -d classes --source-path src src\com\torutk\hello\HelloApp.java
module-info.java の指定を省略した際に、--source-pathを検索するのか実験してみたところ、検索されてコンパイルされました。
(classesの下はきれいに削除してから確認した)
モジュールJARの作成¶
work> jar --create --file ..\modules\hello.jar -C classes .
--create --file
は、cf
と一緒です。
生成されたら、モジュールJARの情報を確認
work> jar -d --file=..\modules\hello.jar com.torutk.hello jar:file:///C:/Users/torutk/Documents/work/../modules/hello.jar/!module-info.class exports com.torutk.hello requires java.base mandated requires javafx.controls requires javafx.graphics
モジュールJARの実行¶
work> java --module-path ..\modules -m com.torutk.hello/com.torutk.hello.HelloApp
画面が表示されました。
- ここで、モジュール名/FQCN名 の区切りの'/'は、Windows OSのパス区切りではないので、スラッシュにします。
カスタムJREの生成¶
work> jlink --module-path ..\modules;"%JAVA_HOME%\jmods" --add-modules com.torutk.hello --output hello
ここで環境変数JAVA_HOMEには、JDKをインストールしたディレクトリが設定されているものとします。
work> echo %JAVA_HOME% C:\Program Files\Java\jdk-9
実行すると、--outputオプションで指定したhelloディレクトリに次のディレクトリ群が生成されます。
bin conf include legal lib release
容量は、80MBとかなりのものです。
work> hello\bin\java --list-modules com.torutk.hello java.base@9-ea java.datatransfer@9-ea java.desktop@9-ea java.prefs@9-ea java.xml@9-ea javafx.base@9-ea javafx.controls@9-ea javafx.graphics@9-ea jdk.jsobject@9-ea
JRE 9のディレクトリ容量は200MBなので、それでも半分以下に削減されています。