我已经从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
答案 0 :(得分:13)
我相信对于您所遇到的错误有一种解释: 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的jmods。我还从同一位置下载了JavaFX 11 SDK(罐)。
编译时间
在编译时,我们可以使用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工具将一组模块及其依赖项组装和优化到自定义运行时映像中。 (source)
让我们开始吧
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。
答案 1 :(得分:0)
如果未自动添加它,请尝试在pom.xml中使用此设置。请务必更改“ !!您的主要班级名称!”在代码的底部使用main方法指向您的类的名称!如果我的班级是Example.java,那么我只想将Example放在其中。
$messages = $twilio->messages
->read(array(
"dateSent" => new \DateTime('2018-8-31'),
);
JavaFX不会自动添加为Java 11的依赖项。这就是为什么我们需要手动添加。