JavaFX模块JavaFX.graphics
在修复robot.awt的requires问题后,我现在在运行应用程序时遇到了另一个问题。应用程序构建没有问题。堆栈跟踪:JavaFX模块JavaFX.graphics,javafx,java-11,Javafx,Java 11,在修复robot.awt的requires问题后,我现在在运行应用程序时遇到了另一个问题。应用程序构建没有问题。堆栈跟踪: Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Me
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:566)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class reports.Main
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class reports.Main (in module Reports) because module Reports does not export reports to module javafx.graphics
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:802)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
... 1 more
Process finished with exit code 1
问题的根本原因包含在此行中:
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class reports.Main (in module Reports) because module Reports does not export reports to module javafx.graphics
Application.launch
使用反射创建应用程序类的实例。只有当类在打开或导出到应用程序的模块(javafx.graphics
)的包中接收时,像Application
这样的外部类才允许通过反射访问您的类
您需要在报告
模块声明中添加以下行之一:
exports reports;
opens reports to javafx.graphics;
最后一行应该是首选的,因为它是限制性更强的一行。如果除非报告
包还包含例如main
类/方法,否则应使用第一行。此行包含问题的根本原因:
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class reports.Main (in module Reports) because module Reports does not export reports to module javafx.graphics
Application.launch
使用反射创建应用程序类的实例。只有当类在打开或导出到应用程序的模块(javafx.graphics
)的包中接收时,像Application
这样的外部类才允许通过反射访问您的类
您需要在报告
模块声明中添加以下行之一:
exports reports;
opens reports to javafx.graphics;
最后一行应该是首选的,因为它是限制性更强的一行。如果除非报告
包还包含例如main
类/方法,否则应使用第一行。
- 如上所述,answer Application.launch使用反射
在java的帮助下创建应用程序类的实例
倒影
- 但是由于模块的原因,反射在默认情况下是不可访问的。
- 在某些情况下,您必须为您的应用程序启用反射
类,在您的情况下,您必须启用
将名为reports的包发送到模块javafx.graphics,让javafx
工作
- 因此,您需要对应用程序进行模块化,包括coz、JDK、JRE和JavaFX
因此是模块化的;在内部创建一个新文件module info.java
包src/main/java,在报告模块块中包含以下语句
模块报告{
需要javafx.controls;
需要javafx.media;
打开到javafx.graphics的报告;
}
- java将把您的应用程序定义为一个名为
报告和您的模块需要一些模块,如(javafx.controls
和javafx.media),以便工作
注意:模块名称报告取自您的包名Main
班级
为什么模块?
模块是组织应用程序和应用程序的新方法
库,它还支持强大的封装和
实现/反射隐藏
- 如上所述,answer Application.launch使用反射
在java的帮助下创建应用程序类的实例
倒影
- 但是由于模块的原因,反射在默认情况下是不可访问的。
- 在某些情况下,您必须为您的应用程序启用反射
类,在您的情况下,您必须启用
将名为reports的包发送到模块javafx.graphics,让javafx
工作
- 因此,您需要对应用程序进行模块化,包括coz、JDK、JRE和JavaFX
因此是模块化的;在内部创建一个新文件module info.java
包src/main/java,在报告模块块中包含以下语句
模块报告{
需要javafx.controls;
需要javafx.media;
打开到javafx.graphics的报告;
}
- java将把您的应用程序定义为一个名为
报告和您的模块需要一些模块,如(javafx.controls
和javafx.media),以便工作
注意:模块名称报告取自您的包名Main
班级
为什么选择模块?
模块是组织应用程序和应用程序的新方法
库,它还支持强大的封装和
实现/反射隐藏
需要注意的是,由于JavaFX要求应用程序
子类及其no-arg构造函数都是公共的,因此使用限定的exports指令也可以(即将报告导出到JavaFX.graphics
)。@fabian,在哪里编辑这两行?模块信息.java
,请注意,由于JavaFX要求应用程序
子类及其no-arg构造函数都是公共的,因此使用限定的exports指令也可以(即将报告导出到JavaFX.graphics
)。@fabian,在哪里编辑这两行?模块信息.java