Java FX 模块化应用程序,未找到模块(Java 17,Intellij)
Java FX Modular Application, Module not found (Java 17, Intellij)
您好,我的模块化 Java FX 应用程序有问题。
首先,我使用 Intellij 向导创建了一个 JavaFX 项目。
我添加了 Java FX 库:enter image description here
我还添加了 VM 选项:enter image description here
但我总是收到此错误消息:enter image description here
"引导层初始化出错
java.lang.module.FindException: 未找到模块 com.example.hudrava_test
“
谢谢。
解决问题的步骤
- 确保您使用的是最新稳定版本的 Idea(当前为 2021.3.2)、Java 和 JavaFX(当前为 17.0.2)。
- 放弃当前项目。
- 创建一个新项目。
- 按照 Idea 在 Create a new JavaFX project 处提供的有关如何使用其向导的说明进行操作。
- 如果您完全按照说明操作,它应该会起作用。
- 您不需要手动将“Java FX 库”添加到项目中。
- 该向导将在 Maven 或 Gradle 中创建依赖项,其中包括最常见的 JavaFX 模块。
- 您不需要下载或使用 openjfx.io 中提到的 JavaFX SDK。
- 您不需要显式设置任何 VM 参数,例如
--add-modules
向导将创建一个 module-info.java
引用模块的文件。
在继续之前,确保基本生成的项目在您的环境中构建和 运行s(根据 IntelliJ 为新的 JavaFX 项目向导记录的构建和执行说明).
使用额外的 JavaFX 模块
如果您想使用额外的 JavaFX 模块(例如 javafx.media 或 javafx.web):
- 手动将附加模块添加到 Maven 或 gradle 构建文件。
- 将构建文件重新导入到 Idea 项目中。
- 将模块中的 require 子句添加到 module-info.java.
正在申请 non-modular
即使您的应用程序是 non-modular,您仍然需要在模块路径上包含 JavaFX 模块,因为这是支持执行 JavaFX 的唯一方式.
如果您不想要模块化应用程序,可以删除 module-info.java 文件并手动将模块路径的 VM 参数添加到 JavaFX 和一个--add-modules
切换。
我不建议执行此步骤,除非:
- 您有充分的理由不拥有 non-modular 应用程序(例如,依赖第三方依赖项,这些依赖项不易与 Java 模块系统集成),并且
- 您了解如何制作 non-modular JavaFX 应用程序。
模块查找异常原因
具体错误的原因:
java.lang.module.FindException: Module com.example.hudrava_test not found
是因为您在模块路径上没有具有该名称的模块的 module-info.java
。请注意,这不是 JavaFX 模块名称,而是您指定的名称。您已尝试通过在 non-existent 模块中指定 class 名称来 运行 应用程序,例如
java --module-path <somepath> -m com.example.hudrava_test/com.example.hudrava_test.HelloApplication
您可以在以下位置找到更多相关信息:
- java.lang.module.FindException: Module not found.
但是,您不需要手动执行该答案中概述的步骤,因为当您使用新的 JavaFX 向导创建新项目时,它会自动创建一个 module-info .java 文件并将应用程序的构建输出放在模块路径上。
所以错误是由您在使用向导创建项目后所做的事情引起的(我不知道是什么)。新建项目时,应该不会出现这个错误。
关于模块命名和下划线
A Java module name follows the same naming rules as Java packages. However, you should not use underscores (_) in module names (or package names, class names, method names, variable names etc.) from Java 9 and forward, because Java wants to use underscore as a reserved identifier in the future.
It is recommended to name a Java module the same as the name of the root Java package contained in the module - if that is possible (some modules might contain multiple root packages).
因此,不建议在模块或包名称中使用下划线。
有关模块命名建议的更多信息,请参阅:
您好,我的模块化 Java FX 应用程序有问题。
首先,我使用 Intellij 向导创建了一个 JavaFX 项目。 我添加了 Java FX 库:enter image description here
我还添加了 VM 选项:enter image description here
但我总是收到此错误消息:enter image description here
"引导层初始化出错 java.lang.module.FindException: 未找到模块 com.example.hudrava_test “ 谢谢。
解决问题的步骤
- 确保您使用的是最新稳定版本的 Idea(当前为 2021.3.2)、Java 和 JavaFX(当前为 17.0.2)。
- 放弃当前项目。
- 创建一个新项目。
- 按照 Idea 在 Create a new JavaFX project 处提供的有关如何使用其向导的说明进行操作。
- 如果您完全按照说明操作,它应该会起作用。
- 您不需要手动将“Java FX 库”添加到项目中。
- 该向导将在 Maven 或 Gradle 中创建依赖项,其中包括最常见的 JavaFX 模块。
- 您不需要下载或使用 openjfx.io 中提到的 JavaFX SDK。
- 您不需要显式设置任何 VM 参数,例如
--add-modules
向导将创建一个module-info.java
引用模块的文件。
在继续之前,确保基本生成的项目在您的环境中构建和 运行s(根据 IntelliJ 为新的 JavaFX 项目向导记录的构建和执行说明).
使用额外的 JavaFX 模块
如果您想使用额外的 JavaFX 模块(例如 javafx.media 或 javafx.web):
- 手动将附加模块添加到 Maven 或 gradle 构建文件。
- 将构建文件重新导入到 Idea 项目中。
- 将模块中的 require 子句添加到 module-info.java.
正在申请 non-modular
即使您的应用程序是 non-modular,您仍然需要在模块路径上包含 JavaFX 模块,因为这是支持执行 JavaFX 的唯一方式.
如果您不想要模块化应用程序,可以删除 module-info.java 文件并手动将模块路径的 VM 参数添加到 JavaFX 和一个--add-modules
切换。
我不建议执行此步骤,除非:
- 您有充分的理由不拥有 non-modular 应用程序(例如,依赖第三方依赖项,这些依赖项不易与 Java 模块系统集成),并且
- 您了解如何制作 non-modular JavaFX 应用程序。
模块查找异常原因
具体错误的原因:
java.lang.module.FindException: Module com.example.hudrava_test not found
是因为您在模块路径上没有具有该名称的模块的 module-info.java
。请注意,这不是 JavaFX 模块名称,而是您指定的名称。您已尝试通过在 non-existent 模块中指定 class 名称来 运行 应用程序,例如
java --module-path <somepath> -m com.example.hudrava_test/com.example.hudrava_test.HelloApplication
您可以在以下位置找到更多相关信息:
- java.lang.module.FindException: Module not found.
但是,您不需要手动执行该答案中概述的步骤,因为当您使用新的 JavaFX 向导创建新项目时,它会自动创建一个 module-info .java 文件并将应用程序的构建输出放在模块路径上。
所以错误是由您在使用向导创建项目后所做的事情引起的(我不知道是什么)。新建项目时,应该不会出现这个错误。
关于模块命名和下划线
A Java module name follows the same naming rules as Java packages. However, you should not use underscores (_) in module names (or package names, class names, method names, variable names etc.) from Java 9 and forward, because Java wants to use underscore as a reserved identifier in the future.
It is recommended to name a Java module the same as the name of the root Java package contained in the module - if that is possible (some modules might contain multiple root packages).
因此,不建议在模块或包名称中使用下划线。
有关模块命名建议的更多信息,请参阅: