我已经从 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 can't be used at run time。
这里有解释:http://openjdk.java.net/jeps/261#Packaging:-JMOD-files :
JMOD files can be used at compile time and link time, but not at run time. To support them at run time would require, in general, that we be prepared to extract and link native-code libraries on-the-fly.
归功于此 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")
在这两种情况下,结果与预期完全相同:编译期间不需要 native 库。
运行时间
现在我们要运行我们的小模块。
使用 jmods,如 OP 所述,运行:
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
工具。
You can use the jlink tool to assemble and optimize a set of modules and their dependencies into a custom runtime image. (source)
那么让我们做:
jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links
这将生成一个 90.7 MB 的文件夹(在我的 Mac 上)。请注意,lib
文件夹包含 Java 11 和 JavaFX 11 中所有必需的 native 库,以及一个名为 modules
的 70.5 MB 文件。
运行时间(二)
我们终于可以做到:
links/bin/java -m hellofx/hellofx.HelloFX
这会奏效。
总而言之,如果我们只想使用 jmods 来编译和运行我们的模块,我们需要使用 jlink
进行额外的步骤。否则,对于运行时,我们将需要 JavaFX SDK。
关于java - 在模块路径上使用 OpenJFX 11 JMODS 在 JDK 11 上运行 javafx 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51843208/