即使明确提供了模块路径,Eclipse 也找不到模块
Posted
技术标签:
【中文标题】即使明确提供了模块路径,Eclipse 也找不到模块【英文标题】:Eclipse cannot find module even the module path is explicitly provided 【发布时间】:2019-04-17 03:01:00 【问题描述】:我创建了一个模块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 吗?以前的版本在正确处理模块路径时存在很多问题。 @kleopatra OP说他有一个module-info.java,他需要JavaFX模块。在这种情况下,不需要添加 --add-modules 命令。使用最新版本的 Ecipse,运行时配置中模块路径的处理也应该可以正常工作,而无需显式指定任何 --module-path。 @kleopatra 我试过--add-modules
,但还是不行。顺便说一句,我仍然不明白这个指令,因为所有必要的模块都应该位于我的模块路径中。此外,我可以使用-p
和-m
在命令行上启动我的程序。
@mipa 是的,我正在使用 Eclipse 4.9.0,我认为这是最新版本,并且我还安装了来自市场的 Java 11 支持。我正在使用 OpenJDK ver11,因为我需要 OpenJFX 11 SDK。正如您所说,理论上,Eclipse 应该能够自动处理模块路径,因为它已将我的 bin
目录添加到模块路径中。
@vesontio 在这种情况下,一切都应该没问题,并且无需任何其他命令行选项即可工作。所以肯定还有另一个问题。我发现可疑的是您的文件夹结构。你为什么不遵守通常的文件夹约定?
【参考方案1】:
在OpenJFX docs for Eclipse(来自 IDE 部分的模块化)中可以找到有关 Eclipse 为何无法运行您的模块化项目的解释。
如前所述:
作为一个模块化项目,由于我们已经在模块路径中添加了 JavaFX SDK 库,因此无需添加任何 VM 参数。
但是如果你在 Eclipse 上运行你会得到上面提到的错误:
启动层初始化时出错 java.lang.module.FindException:找不到模块 javafx.graphics,hellofx 需要
那为什么会失败??
如文档中所述:
发生此异常是因为 Eclipse ant 任务覆盖了模块路径
这是怎么发生的??
检查应用的命令行(Show Command Line
from Run Configurations...),您可以找出原因:
$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 jars 没有添加到模块路径中,因此您会收到错误。
那么我们该如何解决呢?
如链接文档中所述,可能的解决方法是:
要防止出现此问题,请单击运行 -> 运行配置... -> 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 cmets,使其工作的另一种解决方法如下:
由于某种原因,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 在评论中指出的那样,有一个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
【讨论】:
做了:导入 IDE eclipse 模块化项目,配置了一个名为 JavaFX11 的 userLib 指向我的 fx11 jar,删除了启动文件(它使用了一些我没有的环境变量,并提供了一些类似非法的东西char,没有挖掘),将 jre 指向我当前的 openjdk11 - 运行给出“找不到模块 javafx.base”。用添加单独的 jar 替换了 userlib -> 一切正常 对,它有效。所以基本上它是 另一种 解决方法,但更“干净”。当您添加 jars 而不是 library 文件夹时,Eclipse 会发现这些 jars 实际上是模块并将它们添加到路径中......我将编辑我的答案(以及使用这种方法的文档,因为它看起来更好) 实际上我认为这是 Eclipse 中的一个错误:如果模块在 userlib 中提供,它应该能够正确处理它们......事实上,这是 Eclipse 和模块 ;) 前段时间我也在摆弄userlibs,但最终因为奇怪的错误而放弃了。在那之后,我总是明确地添加罐子,从 Eclipse 4.9 开始,这终于起作用了。我认为重要的是,人们有一种简单可靠的方式来使用 JavaFX,并且不会被工具问题的可怕变通方法吓倒,而这实际上并不是 JavaFX 的错。 在最新的 Eclipse 预发布版(4.10 M3)中似乎已经修复了用户库的内容未添加到模块路径的 Eclipse 问题。见bugs.eclipse.org/bugs/show_bug.cgi?id=540305以上是关于即使明确提供了模块路径,Eclipse 也找不到模块的主要内容,如果未能解决你的问题,请参考以下文章
即使安装了@types/node,Typescript 也找不到模块“fs”
即使安装了路径变量集,Tensorflow 也找不到“cudart64_90.dll”