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
进一步更新问题吗?