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

Moh*_*lla 13 java javafx openjfx java-11 javafx-11

我从OpenJFX项目下载了JavaFX Jmod文件并将它们放在目录中G:\openjfx\javafx-jmods-11.我正在使用没有JavaFX jmod的OpenJDK 11,JAVA_HOME/jmods即它没有JavaFX发行版.

模块信息文件:

module gui{
    requires javafx.graphics;
    requires javafx.controls;

    exports com.test;
}
Run Code Online (Sandbox Code Playgroud)

我编译如下:

javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src 
    src\gui\com\test\*.java src\gui\module-info.java
Run Code Online (Sandbox Code Playgroud)

编译成功.但我无法使用以下命令运行已编译的代码:

java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo
Run Code Online (Sandbox Code Playgroud)

但我得到以下错误:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.graphics not found, required by gui
Run Code Online (Sandbox Code Playgroud)

Jos*_*eda 20

我相信您所面临的错误有一个解释:jmods不能在运行时使用.

这在这里解释:http://openjdk.java.net/jeps/261#Packaging : -JMOD-files:

JMOD文件可以在编译时和链接时使用,但不能在运行时使用.为了在运行时支持它们,通常需要我们准备好即时提取和链接本机代码库.

并且归功于这个答案.

所以我做了一些简单的模块hellofx:

module hellofx {
    requires javafx.controls;

    exports hellofx;
}
Run Code Online (Sandbox Code Playgroud)

HelloFX从样品这里并下载JavaFX的11 jmods我的平台,在这里.我还从同一个位置下载了JavaFX 11 SDK(jars).

编译时间

在编译时,我们可以使用jmods:

javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.java")
Run Code Online (Sandbox Code Playgroud)

或者使用SDK:

javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.java")    
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,结果都与预期完全相同:在编译期间不需要本机库.

运行

现在我们要运行我们的小模块.

正如OP所述,使用jmods运行:

java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX   
Run Code Online (Sandbox Code Playgroud)

失败了:

Error occurred during initialization of boot layer
  java.lang.module.FindException: Module javafx.controls not found, required by hellofx
Run Code Online (Sandbox Code Playgroud)

但使用SDK,有效:

java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX
Run Code Online (Sandbox Code Playgroud)

链接时间

正如JEP-261所述,jmods在链接时也能正常工作,因此我们可以jlink在编译时和运行时之间使用该工具.

您可以使用jlink工具将一组模块及其依赖项组合和优化到自定义运行时映像中.(来源)

我们这样做:

jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links
Run Code Online (Sandbox Code Playgroud)

这将生成一个90.7 MB的文件夹(在我的Mac上).请注意,该lib文件夹包含来自Java 11和JavaFX 11的所有必需本机库,以及一个名为70.5 MB的文件modules.

运行时间(2)

我们终于可以做到:

links/bin/java -m hellofx/hellofx.HelloFX
Run Code Online (Sandbox Code Playgroud)

这将有效.

总之,如果我们只想使用jmods来编译和运行我们的模块,我们需要额外的步骤jlink.否则,对于运行时,我们需要JavaFX SDK.

  • 为什么您想要在 SDK 上使用 jmod 文件? (5认同)
  • 非常感谢详细的回答。是的,在运行时 SDK 为我工作。让我也试试 jLink 方法。信息量很大。 (2认同)