IllegalAccessException:无法访问类 C(在模块 M 中),因为模块 M 未将 C 导出到模块 N

All*_*uan 1 java javafx maven

我正在尝试将 Maven 支持添加到我现有的 JavaFX 项目中。

我首先遵循 OpenJFX 的入门指南,该指南教您如何使用 Maven 编译和运行 Hello World JavaFX 应用程序。完成后,我将项目的文件粘贴到这个新项目中并进行了所需的更改。我的文件夹结构或多或少是这样的:

src/main/
  java/
    org.openjfx/
      Main.java
      components/
      controllers/
  resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)

为了运行该项目,我使用以下 Maven 命令:

compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

应用程序启动方法中的异常 原因:java.lang.IllegalAccessException:类 javafx.fxml.FXMLLoader$ValueElement (在模块 javafx.fxml 中)无法访问类 org.openjfx.controllers.LoginController (在模块 org.openjfx 中),因为模块 org. openjfx 不会将 org.openjfx.controllers 导出到模块 javafx.fxml

这看起来很奇怪,因为显然我正在导出以下内容module-info.java

src/main/
  java/
    org.openjfx/
      Main.java
      components/
      controllers/
  resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)

我想知道命名我的包是否org.openjfx是一个坏主意并且可能会导致问题,但我只是按照教程进行操作。

以下是我的pom.xml文件(如果有任何相关性):

compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 5

javafx.fxml模块实例化控制器类,并通过反射访问其中的字段和方法。为了使其工作,您需要open包含模块的任何控制器的特定包javafx.fxml

\n

是了解模块系统的良好资源。引用其中:

\n
\n

打开、打开、打开\xe2\x80\xa6to。在 Java 9 之前,反射可用于了解包中的所有类型以及类型的所有成员\xe2\x80\x94,甚至\nits 私有成员\xe2\x80\x94,无论您是否希望允许此功能。因此,没有任何东西被真正封装。

\n

模块系统的一个关键动机是强大的封装性。默认情况下,模块中的类型无法被其他模块访问,除非\nit\xe2\x80\x99 是公共类型并且导出其包。您仅公开\n您想要公开的包。对于 Java 9,这也适用于\n反射。

\n

...

\n

允许特定模块仅在运行时访问包。形式为 opens\xe2\x80\xa6to 的模块指令

\n
opens package to comma-separated-list-of-modules \n
Run Code Online (Sandbox Code Playgroud)\n

表示\n特定包\xe2\x80\x99s 公共类型(及其嵌套的公共和受保护\n类型)只能在运行时被列出的模块中的代码访问。\n指定包中的所有类型(以及所有types\xe2\x80\x99\nmembers) 可通过反射访问指定模块中的代码。

\n
\n

请注意,您打开的是包,而不是模块。由于您的控制器位于子包中org.openjfx.controllers(我确实认为您应该更改基本包名称),因此您需要显式打开该子包(可能还有其他子包)。

\n

因此,添加

\n
opens org.openjfx.controllers to javafx.fxml ;\n
Run Code Online (Sandbox Code Playgroud)\n

到你的module-info.java文件应该可以解决问题

\n