[英]Error running Sample JavaFX Maven in Netbeans 11 due to Unrecognized option: --module-path
[英]Running javafx sample on JDK 11 with OpenJFX 11 JMODS on Module Path
我從OpenJFX項目下載了JavaFX Jmod文件,並將它們放在目錄G:\\openjfx\\javafx-jmods-11
。 我正在使用OpenJDK 11,它在JAVA_HOME/jmods
沒有JavaFX jmod,即它沒有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文件可以在編譯時和鏈接時使用,但不能在運行時使用。 為了在運行時支持它們,通常需要我們准備好即時提取和鏈接本機代碼庫。
並且歸功於這個答案 。
所以我做了一些簡單的模塊hellofx
:
module hellofx {
requires javafx.controls;
exports hellofx;
}
與HelloFX
從樣品這里並下載JavaFX的11 jmods我的平台, 在這里 。 我還從同一個位置下載了JavaFX 11 SDK(jars)。
編譯時間
在編譯時,我們可以使用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所述,jmods在鏈接時也能正常工作,所以我們可以在編譯時和運行時之間使用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
這將有效。
總之,如果我們想只能使用編譯和運行我們的模塊jmods,我們需要給一個額外的步驟jlink
。 否則,對於運行時,我們需要JavaFX SDK。
如果沒有自動添加它,請嘗試在pom.xml中使用此設置。 一定要改變“!!你的主要密碼!” 使用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的依賴項。這就是我們需要手動添加的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.