我已经创建了一个模块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 arguments
的{{1}}的{{1}}中显式设置模块路径:Run/Debug Settings
,仍然没有运气。
我的问题是:
-p D:\Applications\openjfx-sdk-11\lib
? javaw.exe
?由于我的库被添加为modulepath条目。 我不确定是否已经正确配置了Eclipse,或者可能是OpenJDK的问题,因为当我在装有Oracle Java SE的另一台计算机上工作时,它可以工作。
谢谢。
答案 0 :(得分:5)
可以在OpenJFX docs for Eclipse(IDE部分的模块化内容)中找到有关Eclipse为什么无法运行模块化项目的解释。
如前所述:
作为一个模块化项目,并且由于我们已经将JavaFX SDK库添加到了模块路径中,因此无需添加任何VM参数。
但是,如果您在Eclipse上运行,则会得到上述错误:
启动层初始化期间发生错误 java.lang.module.FindException:hellofx必需的模块javafx.graphics找不到
那为什么会失败?
如文档中所述:
发生此异常是因为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
来添加自己的VM参数来修复该问题。
但是如果您运行它,它将再次失败。
让我们用运行配置中的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 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
基本上,我们在所有失败的选项之后 之后再次添加“正确的”模块路径选项。
现在该项目在运行,解决方案显然不好。
Here,您可以找到OpenJFX文档中引用的示例。
编辑
基于@kleopatra的注释,另一个可行的解决方法如下:
由于某种原因,不扫描库JavaFX11(包含模块化jar),并且Eclipse不在其-p
选项中,而是在类路径中包含了这些jar:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx \
-classpath $PATH_TO_FX \
...
但是,如果您直接将这些罐子添加到模块路径,它将添加它们,这样就可以正常运行:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx:$PATH_TO_FX/javafx.base.jar:...:$PATH_TO_FX/javafx.controls \
...
然后,不再需要覆盖依赖项。
编辑2
正如@mipa在评论中指出的那样,有一个bug已针对此问题提交,并且已经解决。我已经使用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