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

2024-03-20

我创建了一个模块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. In my 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 的用户库,并且该库已添加到项目的模块路径.

然后我尝试在中明确设置模块路径VM arguments in Run/Debug Settings: -p D:\Applications\openjfx-sdk-11\lib,我还是没有运气。

我的问题是:

  • Why javaw.exe?
  • Why classpath?因为我的库被添加为模块路径条目。
  • 如何在eclipse中配置模块依赖关系。

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

谢谢你!


关于 Eclipse 运行模块化项目失败的原因的解释可以在适用于 Eclipse 的 OpenJFX 文档 https://openjfx.io/openjfx-docs/#IDE-Eclipse(来自 IDE 部分的模块化)。

正如已经提到的:

作为一个模块化项目,由于我们已经将 JavaFX SDK 库添加到模块路径中,因此无需添加任何 VM 参数。

但是如果你在 Eclipse 上运行你会得到上面提到的错误:

boot层初始化时出错 java.lang.module.FindException:找不到模块 javafx.graphics,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 库添加到模块路径中。

如果任务生成错误的参数,让我们尝试通过编辑运行配置添加我们自己的虚拟机参数来修复它...并添加-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 参数已添加before默认的 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 

基本上我们再次添加“正确的”模块路径选项,after所有失败的人。

虽然现在项目正在运行,但解决方案显然并不好。

Here https://github.com/openjfx/samples/tree/master/IDE/Eclipse/Modular/Java您可以找到 OpenJFX 文档中引用的示例。

EDIT

根据 @kleopatra 的评论,另一个使其工作的解决方法如下:

由于某种原因,未扫描 JavaFX11 库(包含模块化 jar),并且 Eclipse 不会将这些 jar 包含到其文件中-p选项,但进入类路径:

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p bin/hellofx \
    -classpath $PATH_TO_FX \
    ...

但是,如果你add这些 jar 直接添加到模块路径中,它将添加它们,并且这将运行良好:

$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
    -p bin/hellofx:$PATH_TO_FX/javafx.base.jar:...:$PATH_TO_FX/javafx.controls \
    ...

这样就不再需要重写依赖项了。

EDIT 2

正如@mipa 在评论中指出的那样,有一个bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=540305这个问题已经提交了,并且已经解决了。我用 Eclipse 测试过2018年12月M2 https://www.eclipse.org/downloads/packages/release/2018-12/m2(4.10.0M2) 版本号: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 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使明确提供了模块路径,Eclipse 也找不到模块 的相关文章

  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何在 JavaFX 中将 FontAwesome 升级到版本 5

    我有一个使用 FontAwesome 图标的 JavaFX 我想使用新版本 5 但似乎已经不起作用了 这是一个用 Groovy 编写的简单演示应用程序 可与旧版 FontAwesome 一起使用 import javafx applicat
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐