java - 即使明确提供了模块路径,Eclipse 也找不到模块
问题描述
我创建了一个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
在Run/Debug Settings
:中明确设置模块路径-p D:\Applications\openjfx-sdk-11\lib
,我仍然没有运气。
我的问题是:
- 为什么
javaw.exe
? - 为什么
classpath
?由于我的库被添加为模块路径条目。 - 如何在eclipse中配置模块依赖。
我不确定我是否正确配置了 eclipse,或者当我在另一台安装了 Oracle Java SE 的计算机上工作时,它是否可能是 OpenJDK 的问题。
谢谢!
解决方案
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 \
...
然后有了这个,就不再需要覆盖依赖项了。
编辑 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
推荐阅读
- windows - 如何在 aws cloud vm 中的 windows server 2016 中运行 linux 容器
- javascript - 如何通过点击 JavaScript 输入文本字段内的十字按钮来刷新我的实时搜索?
- php - 我们如何嵌入 TripAdvisor 评论?
- python - 树莓派:使用 Sense Hat 传感器,如何检测加速度?
- android - 在 CameraImage 流中使用 websocket 时,相机渲染缓慢
- pyspark - Pyspark Phoenix 集成在 oozie 工作流程中失败
- php - 如何计算两个 DateInterval 对象的总和
- r - SMOTE in r 显着减少样本量
- unix - 在 Tcl 脚本中将变量传递给 grep 命令
- cucumber - 黄瓜和测试管理工具