java - 在模块路径上使用 OpenJFX 11 JMODS 在 JDK 11 上运行 javafx 示例

标签 java javafx java-11 openjfx javafx-11

我已经从 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;
}

使用来自 hereHelloFX 示例并从 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/

相关文章:

java - 如何制作 Javafx 图像裁剪应用

java - 与 Java 11 兼容的最低 Spring 版本

java - 具有动态变量的单例

java - 在javaFx中,为什么在向窗口添加元素时为什么需要调用 “getChildren()”?

javascript - java而不是cordova元素中的html、css和js

intellij-idea - TornadoFX Unresolved JavaFx

android - 让 Android sdkmanager 与 Java 11 一起运行

java - 迁移到java 11

java - 用于验证 Linux 文件夹路径的正则表达式模式

c# - 评论接口(interface)、实现还是两者兼而有之?