首页 文章

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

提问于
浏览
7

我从OpenJFX项目下载了JavaFX Jmod文件,并将它们放在 G:\openjfx\javafx-jmods-11 目录中 . 我使用的是OpenJDK 11,它在_1761465中没有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

1 回答

  • 6

    我相信您所面临的错误有一个解释: jmods can't be used at run time .

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

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

    并且归功于answer .

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

    module hellofx {
        requires javafx.controls;
    
        exports hellofx;
    }
    

    使用来自hereHelloFX 示例,并从here下载了用于我的平台的JavaFX 11的jmods . 我还从同一个位置下载了JavaFX 11 SDK(jars) .

    Compile time

    在编译时,我们可以使用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")
    

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

    Run time

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

    正如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
    

    Link time

    正如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 的70.5 MB文件 .

    Run time (2)

    我们终于可以做到:

    links/bin/java -m hellofx/hellofx.HelloFX
    

    这将有效 .

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

相关问题