Java 主要方法不包括';不要在模块内运行

Java 主要方法不包括';不要在模块内运行,java,javafx,java-10,java-module,Java,Javafx,Java 10,Java Module,我需要在模块内部还是外部运行我的main方法 我对使用Java的模块化系统是新手。我正在尝试用Java10中的JavaFX创建一个简单的程序,因为它是支持JavaFX的最后一个Java版本 我在JavaFX的模块info.java上导入了必要的依赖项,它只显示了一个简单的窗口 sample.fxmlcode: <?import javafx.scene.layout.GridPane?> <GridPane fx:controller="com.gui.Controller"

我需要在模块内部还是外部运行我的
main
方法

我对使用Java的模块化系统是新手。我正在尝试用Java10中的JavaFX创建一个简单的程序,因为它是支持JavaFX的最后一个Java版本

我在JavaFX的
模块info.java
上导入了必要的依赖项,它只显示了一个简单的窗口

sample.fxml
code:

<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="com.gui.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>
当我尝试运行代码时,我得到:

Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
有人能给我一些建议吗,或者是一些关于用模块化系统创建项目的实际应用建议

我在下面附上了一对截图

生成警告:

运行时故障:


这里可能的疑点是,您正在使用
com.main
作为
module info.java
中的模块名,IDE抱怨在项目中没有找到该名称


我想,这可能是通过使用
com.gui
作为声明中的模块名称来解决的。

我通过确保:

需要javafx依赖项的模块也会自行导出 因为一些javafx包或模块需要它所需要的模块

例如javafx.graphics

还要确保fxml资源是正确的

1.)fxml资源的更正:

2.)导出需要javafx依赖项的模块:

错误:(已读)

解决方案:
module info.java

module com.gui {
    requires javafx.graphics;
    requires javafx.fxml;
    exports com.gui;
}

模块系统增加了更强的封装性。换句话说,不再是所有类都可以被其他类反射访问的情况

以通常的方式启动JavaFX时,会为您实例化
应用程序
子类的一个实例。这是通过反射完成的,这意味着负责实例化子类(
javafx.graphics
)的模块必须具有必要的反射访问权限,才能使用公共的无参数构造函数实例化公共类。要授予此访问权限,包含
应用程序
子类的模块必须
将相应的包导出到至少
javafx.graphics

这在
应用程序
的部分中进行了描述:

应用程序
子类必须声明为public,并且必须具有public无参数构造函数

将应用程序部署为模块

如果
应用程序
子类位于命名模块中,则该类必须可供
javafx.graphics
模块访问。否则,启动应用程序时将引发异常。这意味着,除了类本身被声明为公共之外,模块还必须将包含包导出(或打开)到至少
javafx.graphics
模块

例如,如果
com.foo.MyApplication
位于
foo.app
模块中,则
module info.java
可能如下所示:

module foo.app {
    exports com.foo to javafx.graphics;
}
module foo.app {
    opens com.foo to javafx.fxml;
}

您似乎也在使用FXML。如有必要,您必须确保
javafx.fxml
(例如控制器类)可反射地访问相应的包。这记录在:

将应用程序部署为模块

如果使用
fxmloader
加载命名模块中的类型,则应用程序必须确保FXML文件中引用的所有类型,包括控制器类和任何自定义
节点
类,都可以反射式地访问
javafx.FXML
模块。如果模块
打开包含至少
javafx.fxml
模块的包,则类型是可反射访问的

例如,如果
com.foo.MyController
位于
foo.app
模块中,则
module info.java
可能如下所示:

module foo.app {
    exports com.foo to javafx.graphics;
}
module foo.app {
    opens com.foo to javafx.fxml;
}

请在发布前检查您的问题,并纠正任何错误。不要使用引号而不是代码块,反之亦然。不要共享图像链接,而是将图像包含在问题本身中。@neth07另一方面,在问题中添加
module info.java
代码也会使问题更加清楚。谢谢你,现在第一个问题已经解决了,问题是我在前面做测试时忘记删除
com.main
的合格导出。您对运行时故障有何看法?@neth07我希望您现在能用正确的
module info.java
sample.fxml
进一步更新问题吗?