IntelliJ can't recognize JavaFX 11 with OpenJDK 11
我在让IntellJ识别JavaFX软件包方面遇到麻烦。 对于新的JavaFX项目和OpenJDK 11,在尝试构建项目时,IntelliJ无法识别JavaFX软件包。
我已经从Maven仓库导入了
我看过其他问题,解决方案的范围似乎从检查字节码是否在正确的级别(我的是),以及项目语言是否正确(我的是)开始。
有人有主意吗?
编辑:
错误:
如评论中所述,《入门指南》是从Java 11和JavaFX 11开始的地方。
像您在Java 11之前所做的那样工作的关键是要了解:
- JavaFX 11不再是JDK的一部分
-
您可以通过SDK或
常规依赖关系(Maven / Gradle)。 - 即使您的项目不是模块化的,也需要将其包括在项目的模块路径中。
JavaFX项目
如果您在IntelliJ中创建常规JavaFX默认项目(没有Maven或Gradle),建议您从此处下载SDK。请注意,也有jmods,但是对于非模块化项目,SDK是首选。
这些是运行默认项目的简单步骤:
在运行默认项目之前,只需将它们添加到VM选项中:
跑
马文
如果您使用Maven构建项目,请按照下列步骤操作:
添加JavaFX 11依赖项。
1 2 3 4 5 6 7 8 9 10 11 12 | <dependencies> <dependency> <groupId>org.openjfx</groupId> javafx-controls</artifactId> <version>11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> javafx-fxml</artifactId> <version>11</version> </dependency> </dependencies> |
完成此操作后,您将注意到现在可以在编辑器中识别JavaFX类。
您会注意到Maven为您管理了必需的依赖项:它将为javafx.controls添加javafx.base和javafx.graphics,但最重要的是,它将基于您的平台添加必需的分类器。就我而言,是Mac。
这就是为什么jars
如果您仍然想转到.m2存储库并从那里手动获取依赖项,请确保选择正确的依赖项(例如
从此处替换默认的maven插件。
运行
Gradle项目也有类似的工作,如此处详细说明。
编辑
提到的《入门指南》包含IntelliJ的更新文档和示例项目:
-
不含Maven / Gradle的JavaFX 11,请参阅非模块化样本或模块化样本项目。
-
带有Maven的JavaFX 11,请参阅非模块化样本或模块化样本项目。
-
JavaFX 11 with Gradle,请参阅非模块化样本或模块化样本项目。
JavaFX不再是JDK 11的一部分。
以下解决方案使用IntelliJ起作用(尚未在NetBeans上尝试过):
添加JavaFX全局库作为依赖项:
设置->项目结构->模块。在模块中转到
依赖性选项卡,然后单击添加" +"号->库-> Java->
从列表中选择JavaFX,然后单击"添加选定项",然后单击"应用设置"。
右键单击JavaFX项目中的源文件(src),然后创建一个新的
module-info.java文件。在文件内部编写以下代码:
1 2 3 4 5 6 | module YourProjectName { requires javafx.fxml; requires javafx.controls; requires javafx.graphics; opens sample; } |
我向您保证,这两个步骤将解决JavaFX的所有问题。
参考:学习编程频道制作了一个You Tube教程,将在5分钟内解释以上所有详细信息。我也建议您观看它以解决您的问题:
https://www.youtube.com/watch?v=WtOgoomDewo
以上都不对我有用。 我花了太多时间来清除出现的其他错误。 我发现这是最简单,最好的方法。
这也适用于在Jdk 11、12和OpenJdk12上获取JavaFx!
- 该视频向您展示了JavaFx Sdk下载
- 如何将其设置为全局库
- 设置module-info.java(我更喜欢底部的模块)
1 2 3 4 5 6 | module thisIsTheNameOfYourProject { requires javafx.fxml; requires javafx.controls; requires javafx.graphics; opens sample; } |
整个过程只花了我5分钟!
快速总结,您可以执行以下任一操作:
好的。
像José的答案一样,通过
好的。
要么
好的。
将JavaFX库添加到项目中后(手动或通过maven / gradle导入),添加
好的。
此答案是Jose答案的补充。
好的。
情况是这样的:
好的。
尝试从Intellij Idea运行JavaFX应用程序时生成
好的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 |
好的,现在您有点卡住,不知道发生了什么。
好的。
实际上发生的是这样的:
好的。
因此看来一切都应该没问题。但是,当您运行应用程序时,尝试使用反射实例化应用程序类(调用启动时)和FXML控制器类(加载FXML时)的实例时,JavaFX模块中的代码将失败。如果没有任何帮助,这种反射的使用在某些情况下可能会失败,从而产生模糊的
好的。
这是该问题的其他一些答案(参考
好的。
因此,让我们在Java模块中学习速成课程:
好的。
好的。
关键部分是:
好的。
4.9。开门
好的。
如果我们需要允许私有类型的反映,但我们不希望所有
我们公开的代码中,我们可以使用opens指令公开特定的
包。好的。
但是请记住,这将向全世界开放包装,因此
确保这是您想要的:好的。
1 module my.module { opens com.my.package; }blockquote>
因此,也许您不想向全世界打开您的包裹,那么您可以这样做:
好的。
4.10. Opens … To
Ok.
Okay, so reflection is great sometimes, but we still want as much security as we can get from encapsulation. We can selectively open our packages to a pre-approved list of modules, in this case, using the opens…to directive:
Ok.
module my.module {
opens com.my.package to moduleOne, moduleTwo, etc.;
}Ok.
因此,您最终创建了一个src / main / java / module-info.java类,如下所示:
好的。
1
2
3
4
5
6 module org.jewelsea.demo.javafx.springboot {
requires javafx.fxml;
requires javafx.controls;
requires javafx.graphics;
opens org.jewelsea.demo.javafx.springboot to javafx.graphics,javafx.fxml;
}其中,
org.jewelsea.demo.javafx.springboot 是包含JavaFX Application类和JavaFX Controller类的软件包的名称(将其替换为您的应用程序的适当软件包名称)。这告诉Java运行时,javafx.graphics 和javafx.fxml 中的类可以对org.jewelsea.demo.javafx.springboot 包中的类调用反射。一旦完成,并编译了应用程序,然后重新运行,一切正常,并且JavaFX使用反射生成的IllegalAccessError 将不再发生。好的。
但是如果您不想创建module-info.java文件怎么办
好的。
如果不是使用IDE顶部工具栏中的"运行"按钮直接运行应用程序类,而是:
好的。
转到IDE侧面的Maven窗口。 选择javafx maven插件目标 javafx.run 。右键单击它,然后选择 Run Maven Build 或Debug... 。然后,该应用程序将在没有
module-info.java 文件的情况下运行。我猜这是因为maven插件足够聪明,可以动态地包含某种设置,即使没有module-info.java 文件,该设置也可以使JavaFX类反映该应用程序,尽管我不知道这是如何实现的。好的。
要将设置转移到顶部工具栏中的"运行"按钮,请右键单击
javafx.run Maven目标并为目标选择Create Run/Debug Configuration 选项。然后,您只需从顶部工具栏中选择"运行"即可执行Maven目标。好的。
好。