即使明确提供了模块路径,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 也找不到模块的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使安装了 FBX 模块也找不到?

即使安装了@types/node,Typescript 也找不到模块“fs”

即使安装了路径变量集,Tensorflow 也找不到“cudart64_90.dll”

CSS 模块在 Codesandbox 中不起作用 - 即使它们存在也找不到文件

即使在钥匙串中也找不到 iOS 应用商店分发证书

游戏框架中的类路径问题