18

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

我编译如下:

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
4

2 回答 2

29

我相信您所面临的错误有一个解释: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。

于 2018-10-05T21:25:04.600 回答
0

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

 <dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11.0.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>!!YOUR MAIN CLASSNAME HERE!!</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

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

于 2019-02-07T06:51:14.760 回答