我相信您所面临的错误有一个解释:jmods can't be used at run time。
这在这里解释: http: //openjdk.java.net/jeps/261#Packaging :-JMOD-files :
JMOD 文件可以在编译时和链接时使用,但不能在运行时使用。通常,要在运行时支持它们,我们需要准备好动态地提取和链接本机代码库。
归功于这个答案。
所以我做了一些简单的模块hellofx
:
module hellofx {
requires javafx.controls;
exports hellofx;
}
使用此处的示例HelloFX
并从此处下载适用于我的平台的 JavaFX 11 的 jmod 。我还从同一位置下载了 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")
在这两种情况下,结果完全一样,正如预期的那样:编译时不需要本地库。
运行
现在我们要运行我们的小模块。
使用 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
在编译时和运行时之间使用该工具。
您可以使用 jlink 工具将一组模块及其依赖项组装和优化为自定义运行时映像。(来源)
所以让我们这样做:
jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links
这将生成一个 90.7 MB 的文件夹(在我的 Mac 上)。请注意,该lib
文件夹包含来自 Java 11 和 JavaFX 11 的所有必需的本机库,以及一个名为modules
.
运行时间 (2)
我们终于可以做到了:
links/bin/java -m hellofx/hellofx.HelloFX
这会奏效。
总之,如果我们只想使用 jmods 来编译和运行我们的模块,我们需要给jlink
. 否则,对于运行时,我们将需要 JavaFX SDK。