Eclipse找不到模块,即使已明确提供模块路径

时间:2018-11-14 07:42:29

标签: java eclipse javafx java-module javafx-11

我已经创建了一个模块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中配置模块依赖性。

我不确定是否已经正确配置了Eclipse,或者可能是OpenJDK的问题,因为当我在装有Oracle Java SE的另一台计算机上工作时,它可以工作。

谢谢。

1 个答案:

答案 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 \
    ...

eclipse module-path

然后,不再需要覆盖依赖项。

编辑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 

Eclipse 4.10

相关问题