9

我创建了一个com.company.ep位于源文件夹中的模块com.company.ep。(是的,我已经src从构建路径中删除并删除了它!)在源文件夹中,我有几个包如下:

com.company.ep    <--- root source folder
    com.company.ep.main    <--- package 1
    com.company.ep.model   <--- package 2
    com.company.ep.view    <--- package 3
    // ... more packages
    module-info.java

主类位于包中com.company.ep.main.Main。在我的module-info.java中,我已经配置了依赖项:

module com.company.ep {
    exports com.company.ep.main;
    exports com.company.ep.model;
    exports com.company.ep.view;
    // ... more exports
    requires javafx.controls;
    requires javafx.graphics;
}

当我尝试启动我的程序时,eclipse 告诉我:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found, required by com.company.ep

所以,我尝试在命令提示符下运行它:

java -p d:\Applications\openjfx-sdk-11\lib;bin -m com.company.ep/com.company.ep.main.Main

bin是 Eclipse 的输出文件夹,它工作

所以,我去了Properties → Run/Debug Settings → Main → Show Command Line,它显示:

D:\Applications\openjdk-11.0.1\bin\javaw.exe -Dfile.encoding=UTF-8 -p "D:\Development\Eclipse-Workspace\MyProject\bin" -classpath "D:\Applications\openjfx-sdk-11\lib\javafx.base.jar;D:\Applications\openjfx-sdk-11\lib\javafx.controls.jar;D:\Applications\openjfx-sdk-11\lib\javafx.fxml.jar;D:\Applications\openjfx-sdk-11\lib\javafx.graphics.jar;D:\Applications\openjfx-sdk-11\lib\javafx.media.jar;D:\Applications\openjfx-sdk-11\lib\javafx.swing.jar;D:\Applications\openjfx-sdk-11\lib\javafx.web.jar;D:\Applications\openjfx-sdk-11\lib\javafx-swt.jar" -m com.company.ep/com.company.ep.main.Main

我创建了一个添加了所有 JAR 的用户库,并将该库添加到项目的Modulepath中。

然后我尝试VM argumentsRun/Debug Settings:中明确设置模块路径-p D:\Applications\openjfx-sdk-11\lib,我仍然没有运气。

我的问题是:

  • 为什么javaw.exe
  • 为什么classpath?由于我的库被添加为模块路径条目。
  • 如何在eclipse中配置模块依赖。

我不确定我是否正确配置了 eclipse,或者当我在另一台安装了 Oracle Java SE 的计算机上工作时,它是否可能是 OpenJDK 的问题。

谢谢!

4

1 回答 1

10

Eclipse 为何无法运行模块化项目的解释可以在OpenJFX 文档中找到(来自 IDE 部分的模块化)。

正如已经提到的:

作为一个模块化项目,由于我们已经将 JavaFX SDK 库添加到了模块路径中,因此无需添加任何 VM 参数。

但是如果你在 Eclipse 上运行,你会得到上面提到的错误:

启动层初始化时出错 java.lang.module.FindException: Module javafx.graphics not found, required by hellofx

那为什么会失败??

如文档中所述:

发生此异常是因为 Eclipse ant 任务覆盖了模块路径

这是怎么回事??

检查应用的命令行(Show Command Line来自运行配置...),您可以找出原因:

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p bin/hellofx \
    -classpath $PATH_TO_FX \
    -m hellofx/org.openjfx.MainApp 

如果您复制并粘贴它并在终端中运行它,它当然会失败并显示相同的消息。原因是 Eclipse 没有将 JavaFX 库添加到模块路径中。

如果任务生成错误的参数,让我们尝试通过编辑运行配置添加我们自己的 VM 参数来修复它...并添加-p $PATH_TO_FX:bin/hellofx.

但是如果你运行它,它会再次失败。

Show Command Line让我们从运行配置中检查原因...

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p $PATH_TO_FX:bin/hellofx \
    -p bin/hellofx \
    -classpath $PATH_TO_FX \
    -m hellofx/org.openjfx.MainApp 

如您所见,用户的VM参数添加默认的ant任务参数之前,因此有两个-p--module-path)选项,第一个(带有JavaFX jars的用户)被第二个(仅项目的模块)覆盖),因此,JavaFX jar 不会添加到模块路径中,因此您会收到错误消息。

那么我们该如何解决呢??

如链接文档中所述,可能的解决方法是:

要防止出现此问题,请单击 Run -> Run Configurations... -> Java Application -> Dependencies,选择 Override Dependencies... 并添加-p /path-to/javafx-sdk-11/lib:bin/hellofx,然后按 Override。

使用此解决方案,您可以看到它有效,并且您可以检查命令行:

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p $PATH_TO_FX:bin/hellofx \
    -p bin/hellofx \
    -classpath $PATH_TO_FX \
    -p /path-to/javafx-sdk-11/lib:bin/hellofx \
    -m hellofx/org.openjfx.MainApp 

基本上,在所有失败的模块路径选项之后,我们再次添加“正确”模块路径选项。

虽然现在项目正在运行,但解决方案显然不是很好。

在这里,您可以找到从 OpenJFX 文档中引用的示例。

编辑

根据@kleopatra 的评论,使其工作的另一种解决方法如下:

出于某种原因,库 JavaFX11(包含模块化 jar)没有被扫描,并且 Eclipse 没有将这些 jar 包含在其-p选项中,而是包含在类路径中:

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p bin/hellofx \
    -classpath $PATH_TO_FX \
    ...

但是,如果您这些 jar 直接添加到模块路径中,它会添加它们,并且运行良好:

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p bin/hellofx:$PATH_TO_FX/javafx.base.jar:...:$PATH_TO_FX/javafx.controls \
    ...

eclipse模块路径

然后有了这个,就不再需要覆盖依赖项了。

编辑 2

正如@mipa 在评论中指出的那样,在这个问题上存在一个错误,并且已经解决了。我已经使用 Eclipse 2018-12 M2 (4.10.0M2) Build id: 20181108-1653 对其进行了测试,它JavaFX11仅适用于库(应该如此):

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p bin/hellofx:$PATH_TO_FX/javafx.base.jar:... \
    -m hellofx/org.openjfx.MainApp 

日食 4.10

于 2018-11-14T10:00:50.437 回答