javafx不再是jdk11的一部分的问题。以下解决方案可以使用intellij(还没有在netbeans中尝试): 添加javafx全局库作为依赖项: 设置->项目结构->模块。在模块中,转到dependencies选项卡,单击add“+”符号->library->java->choose javafx from the list,单击add selected,然后应用设置。 右键单击javafx项目中的源文件(src),并创建一个新的module-info.java文件。在文件内部编写以下代码:
Exception in Application start method
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:567)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
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:567)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x45069d0e) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x45069d0e
at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)
at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.java:2056)
at org.jewelsea.demo.javafx.springboot.Main.start(Main.java:13)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
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(AccessController.java:391)
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)
Exception running application org.jewelsea.demo.javafx.springboot.Main
4条答案
按热度按时间rt4zxlrg1#
正如评论中提到的,入门指南是从Java11和JavaFX11开始的地方。
要像java 11之前那样工作,关键是要理解:
JavaFX11不再是jdk的一部分
您可以以不同的方式获得它,既可以作为sdk,也可以作为常规依赖项(maven/gradle)。
即使您的项目不是模块化的,您也需要将其包含到项目的模块路径中。
javafx项目
如果您在intellij中创建一个常规的javafx默认项目(没有maven或gradle),我建议您从这里下载sdk。注意,也有jmods,但是对于非模块化项目,sdk是首选。
以下是运行默认项目的简单步骤:
创建javafx项目
设置jdk 11(指向您的本地java11版本)
添加javafx11sdk作为库。url可以是
/Users/<user>/Downloads/javafx-sdk-11/lib/
. 一旦您这样做了,您就会注意到javafx类现在在编辑器中被识别了。在运行默认项目之前,只需将以下选项添加到vm选项中:
--module-path /Users/<user>/Downloads/javafx-sdk-11/lib --add-modules=javafx.controls,javafx.fxml
运行Maven
如果使用maven构建项目,请执行以下步骤:
使用javafx原型创建maven项目
设置jdk 11(指向您的本地java11版本)
添加javafx11依赖项。
一旦您这样做了,您就会注意到javafx类现在在编辑器中被识别了。
您将注意到maven为您管理所需的依赖项:它将为javafx.controls添加javafx.base和javafx.graphics,但最重要的是,它将根据您的平台添加所需的分类器。对我来说,麦克。
这就是为什么你的jar
org.openjfx:javafx-controls:11
是空的,因为有三个可能的分类器(windows、linux和mac平台),它们包含所有类和本机实现。如果您仍然想转到.m2回购并从那里手动获取依赖项,请确保您选择了正确的一个(例如
.m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11-mac.jar
)用这里的插件替换默认的maven插件。
跑
mvn compile javafx:run
,它应该会起作用。gradle项目也有类似的工作,在这里详细解释。
编辑
上述入门指南包含intellij的更新文档和示例项目:
javafx11没有maven/gradle,请参阅非模块化示例或模块化示例项目。
javafx11和maven,请参阅非模块化示例或模块化示例项目。
带有gradle的javafx11,请参阅非模块化示例或模块化示例项目。
g2ieeal72#
以上这些对我都不管用。我花了太多时间来清除出现的其他错误。我发现这是最简单最好的方法。
这对于在jdk11、12和openjdk12上获取javafx也是有效的!
视频向您展示了javafxsdk下载
如何将其设置为全局库
设置module-info.java(我更喜欢下面的那个)
整个过程只花了我5分钟!!!
vaqhlq813#
javafx不再是jdk11的一部分的问题。以下解决方案可以使用intellij(还没有在netbeans中尝试):
添加javafx全局库作为依赖项:
设置->项目结构->模块。在模块中,转到dependencies选项卡,单击add“+”符号->library->java->choose javafx from the list,单击add selected,然后应用设置。
右键单击javafx项目中的源文件(src),并创建一个新的module-info.java文件。在文件内部编写以下代码:
我向您保证,这两个步骤将解决javafx的所有问题。
参考:学习编程频道有一个youtube教程,将在5分钟内解释以上所有细节。我也建议你看它来解决你的问题:https://www.youtube.com/watch?v=wtogoomdewo
myzjeezk4#
快速总结,您可以执行以下任一操作:
包括javafx模块
--module-path
以及--add-modules
就像在乔斯é'这是我的回答。或
将javafx库添加到项目后(手动或通过maven/gradle导入),添加
module-info.java
类似于此答案中指定的文件(请注意,此解决方案使您的应用程序模块化,因此,如果您使用其他库,您还需要添加语句以在module-info.java
文件)。这个答案是对何塞答案的补充。
情况是这样的:
您使用的是最新的java版本,例如13。
您有一个javafx应用程序作为maven项目。
在maven项目中,您已经按照jose的回答配置了javafx插件和javafx依赖项。
转到扩展应用程序的主类的源代码,右键单击它并尝试运行它。
你得到一个
IllegalAccessError
尝试启动应用程序时涉及“未命名模块”。生成
IllegalAccessError
尝试从intellij idea运行javafx应用程序时:好吧,现在你有点困了,不知道发生了什么。
实际情况是:
maven已经成功地为您的应用程序下载了javafx依赖项,因此您不需要单独下载依赖项或安装javafxsdk或模块发行版之类的东西。
idea已经成功地将模块作为依赖项导入到您的项目中,所以所有的编译都正常,所有的代码都完成了,所有的工作都正常。
看来一切都会好起来的。但是,当您运行应用程序时,javafx模块中的代码在尝试使用反射示例化应用程序类(当您调用launch时)和fxml控制器类(当您加载fxml时)的示例时失败。如果没有一些帮助,这种反射的使用在某些情况下可能会失败,从而产生模糊的结果
IllegalAccessError
. 这是由于java模块系统的安全特性导致的,它不允许来自其他模块的代码在类上使用反射,除非您显式地允许它(javafx应用程序启动程序和fxmloader都需要在它们当前的实现中进行反射,以便它们正确地工作)。这就是这个问题的其他一些答案,其中的参考
module-info.java
,进入画面。让我们来学习java模块的速成课程:
https://www.baeldung.com/java-9-modularity
关键在于:
4.9. 打开
如果我们需要允许私有类型的反射,但不希望所有代码都公开,那么可以使用opens指令公开特定的包。
但请记住,这将向全世界开放软件包,因此请确保这是您想要的:
所以,也许你不想向全世界开放你的包裹,那么你可以:
4.10. 打开…到
好吧,反射有时是很好的,但是我们仍然希望从封装中获得尽可能多的安全性。我们可以使用opens…to指令有选择地将包打开到预先批准的模块列表中,在这种情况下:
module my.module{打开com.my.package到moduleone、moduletwo等;}
因此,您最终创建了一个src/main/java/module-info.java类,如下所示:
哪里,
org.jewelsea.demo.javafx.springboot
包含javafx应用程序类和javafx控制器类的包的名称(将其替换为应用程序的适当包名称)。这告诉java运行时,对于javafx.graphics
以及javafx.fxml
调用对org.jewelsea.demo.javafx.springboot
包裹。一旦完成了这项工作,应用程序被编译并重新运行,一切都会很好地工作IllegalAccessError
由javafx使用反射生成的。但是如果不想创建module-info.java文件呢
如果不是使用ide顶部工具栏中的“运行”按钮直接运行应用程序类,而是:
去了ide旁边的maven窗口。
选择了javafxmaven插件目标
javafx.run
.右键单击并选择
Run Maven Build
或者Debug...
.然后应用程序将在没有
module-info.java
文件。我想这是因为maven插件足够聪明,可以动态地包含一些设置,这些设置允许javafx类反映应用程序,即使没有module-info.java
但我不知道这是怎么做到的。要将该设置转移到顶部工具栏中的“运行”按钮,请右键单击
javafx.run
maven target并选择Create Run/Debug Configuration
为了目标。然后您可以从顶部工具栏中选择run来执行maven目标。