关于 Eclipse 运行模块化项目失败的原因的解释可以在适用于 Eclipse 的 OpenJFX 文档 https://openjfx.io/openjfx-docs/#IDE-Eclipse(来自 IDE 部分的模块化)。
正如已经提到的:
作为一个模块化项目,由于我们已经将 JavaFX SDK 库添加到模块路径中,因此无需添加任何 VM 参数。
但是如果你在 Eclipse 上运行你会得到上面提到的错误:
boot层初始化时出错
java.lang.module.FindException:找不到模块 javafx.graphics,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 库添加到模块路径中。
如果任务生成错误的参数,让我们尝试通过编辑运行配置添加我们自己的虚拟机参数来修复它...并添加-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 参数已添加before默认的 ant 任务参数,所以有两个-p
(--module-path
) 选项,并且第一个选项(带有 JavaFX jar 的用户选项)被第二个选项(仅项目的模块)覆盖,因此,JavaFX jar 再次不会添加到模块路径中,因此您会收到错误。
那么我们该如何解决呢?
正如链接文档中提到的,可能的修复方法是:
要防止此问题,请单击“运行”->“运行配置...”->“Java 应用程序”->“依赖项”,选择“覆盖依赖项...”并添加-p /path-to/javafx-sdk-11/lib:bin/hellofx
,然后按覆盖。
通过这个解决方案,你可以看到它有效,你可以检查命令行:
$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
基本上我们再次添加“正确的”模块路径选项,after所有失败的人。
虽然现在项目正在运行,但解决方案显然并不好。
Here https://github.com/openjfx/samples/tree/master/IDE/Eclipse/Modular/Java您可以找到 OpenJFX 文档中引用的示例。
EDIT
根据 @kleopatra 的评论,另一个使其工作的解决方法如下:
由于某种原因,未扫描 JavaFX11 库(包含模块化 jar),并且 Eclipse 不会将这些 jar 包含到其文件中-p
选项,但进入类路径:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx \
-classpath $PATH_TO_FX \
...
但是,如果你add这些 jar 直接添加到模块路径中,它将添加它们,并且这将运行良好:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx:$PATH_TO_FX/javafx.base.jar:...:$PATH_TO_FX/javafx.controls \
...
这样就不再需要重写依赖项了。
EDIT 2
正如@mipa 在评论中指出的那样,有一个bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=540305这个问题已经提交了,并且已经解决了。我用 Eclipse 测试过2018年12月M2 https://www.eclipse.org/downloads/packages/release/2018-12/m2(4.10.0M2) 版本号: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