在模块路径

时间:2018-08-14 13:55:44

标签: java javafx java-11 openjfx javafx-11

我已经从OpenJFX项目下载了JavaFX Jmod文件,并将它们放在目录G:\openjfx\javafx-jmods-11中。我正在使用JAVA_HOME/jmods中没有JavaFX jmod的OpenJDK 11,即它不随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

2 个答案:

答案 0 :(得分:13)

我相信对于您所遇到的错误有一种解释: jmods不能在运行时使用

在此进行解释: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(罐)。

编译时间

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

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

运行时间

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

使用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

链接时间

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

  

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

让我们开始吧

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文件。

运行时间(2)

我们终于可以做到:

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

那将起作用。

最后,如果我们只想使用jmods来编译和运行我们的模块,则需要使用jlink采取额外的步骤。否则,对于运行时,我们将需要JavaFX SDK。

答案 1 :(得分:0)

如果未自动添加它,请尝试在pom.xml中使用此设置。请务必更改“ !!您的主要班级名称!”在代码的底部使用main方法指向您的类的名称!如果我的班级是Example.java,那么我只想将Example放在其中。

$messages = $twilio->messages
                   ->read(array(
                       "dateSent" => new \DateTime('2018-8-31'),
                   );

JavaFX不会自动添加为Java 11的依赖项。这就是为什么我们需要手动添加。