OpenJFXプロジェクトからJavaFX Jmodファイルをダウンロードし、G:\openjfx\javafx-jmods-11
ディレクトリに配置しました。 Java_HOME/jmods
にJavaFX jmodがないOpenJDK 11を使用しています。つまり、JavaFXディストリビューションには付属していません。
モジュール情報ファイル:
module gui{
requires javafx.graphics;
requires javafx.controls;
exports com.test;
}
私は次のようにコンパイルします:
javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src
src\gui\com\test\*.Java src\gui\module-info.Java
コンパイルは成功します。しかし、次のコマンドを使用してコンパイルされたコードを実行することはできません。
Java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo
しかし、次のエラーが表示されます。
Error occurred during initialization of boot layer
Java.lang.module.FindException: Module javafx.graphics not found, required by gui
あなたが直面しているエラーの説明があると思います:jmodsは実行時に使用できません。
これはここで説明されます: http://openjdk.Java.net/jeps/261#Packaging:-JMOD-files :
JMODファイルはコンパイル時とリンク時に使用できますが、実行時は使用できません。実行時にそれらをサポートするには、一般に、ネイティブコードライブラリをその場で抽出およびリンクする準備が必要です。
クレジットはこれになります answer 。
簡単なモジュールhellofx
を作成しました:
module hellofx {
requires javafx.controls;
exports hellofx;
}
here のHelloFX
サンプルを使用し、 here からプラットフォームのJavaFX 11のjmodをダウンロードしました。また、同じ場所からJavaFX 11 SDK(jar)をダウンロードしました。
コンパイル時間
コンパイル時に、jmodsを使用して次のことができます。
javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.Java")
またはSDKを使用:
javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.Java")
どちらの場合でも、結果は予想どおりまったく同じです。ネイティブライブラリはコンパイル時に不要です。
実行時間
次に、小さなモジュールを実行します。
OPで述べられているように、jmodsを使用して、次を実行します。
Java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX
失敗します:
Error occurred during initialization of boot layer
Java.lang.module.FindException: Module javafx.controls not found, required by hellofx
ただし、SDKを使用すると動作します。
Java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX
リンク時間
JEP-261で述べられているように、jmodはリンク時にも機能するため、コンパイル時間と実行時間の間にjlink
ツールを使用できます。
Jlinkツールを使用して、一連のモジュールとその依存関係をカスタムランタイムイメージにアセンブルおよび最適化できます。 ( ソース )
やってみましょう:
jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links
90.7 MBのフォルダーが生成されます(私のMac)。 lib
フォルダーには、Java 11およびJavaFX 11から必要なすべてのネイティブライブラリと、modules
という名前の70.5 MBファイルが含まれていることに注意してください。
実行時間(2)
そして、最終的に次のことができます。
links/bin/Java -m hellofx/hellofx.HelloFX
そして、それは動作します。
結論として、モジュールのコンパイルと実行にjmodのみを使用する場合は、jlink
を使用して追加の手順を実行する必要があります。それ以外の場合、ランタイムにはJavaFX SDKが必要です。
自動的に追加されない場合は、pom.xmlでこのセットアップを使用してみてください。必ず「!! YOUR MAIN CLASSNAME HERE !!」を変更してくださいコードの下部に向かって、mainメソッドを使用してクラスの名前を指定します。クラスがExample.Javaの場合は、Exampleだけを配置します。
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>Java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>!!YOUR MAIN CLASSNAME HERE!!</mainClass>
</configuration>
</plugin>
</plugins>
</build>
JavaFXは、Java 11の依存関係として自動的に追加されません。そのため、手動で追加する必要があります。