intellij无法识别带有openjdk 11的javafx11

gdrx4gfi  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(675)

我很难让intellj识别javafx包。对于一个新的javafx项目openjdk 11,当试图构建该项目时,intellij无法识别javafx包。
我已经进口了 openjfx:javafx-base-11 来自maven回购。
我已经研究了其他问题,解决方案似乎包括检查字节码是否在正确的级别(我的是),以及项目语言是否正确(我的是)。
有人有什么想法吗?



编辑:
错误:

rt4zxlrg

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依赖项。

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11</version>
    </dependency>
</dependencies>

一旦您这样做了,您就会注意到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,请参阅非模块化示例或模块化示例项目。

g2ieeal7

g2ieeal72#

以上这些对我都不管用。我花了太多时间来清除出现的其他错误。我发现这是最简单最好的方法。
这对于在jdk11、12和openjdk12上获取javafx也是有效的!
视频向您展示了javafxsdk下载
如何将其设置为全局库
设置module-info.java(我更喜欢下面的那个)

module thisIsTheNameOfYourProject {
    requires javafx.fxml;
    requires javafx.controls;
    requires javafx.graphics;
    opens sample;
}

整个过程只花了我5分钟!!!

vaqhlq81

vaqhlq813#

javafx不再是jdk11的一部分的问题。以下解决方案可以使用intellij(还没有在netbeans中尝试):
添加javafx全局库作为依赖项:
设置->项目结构->模块。在模块中,转到dependencies选项卡,单击add“+”符号->library->java->choose javafx from the list,单击add selected,然后应用设置。
右键单击javafx项目中的源文件(src),并创建一个新的module-info.java文件。在文件内部编写以下代码:

module YourProjectName { 
    requires javafx.fxml;
    requires javafx.controls;
    requires javafx.graphics;
    opens sample;
}

我向您保证,这两个步骤将解决javafx的所有问题。
参考:学习编程频道有一个youtube教程,将在5分钟内解释以上所有细节。我也建议你看它来解决你的问题:https://www.youtube.com/watch?v=wtogoomdewo

myzjeezk

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应用程序时:

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

好吧,现在你有点困了,不知道发生了什么。
实际情况是:
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指令公开特定的包。
但请记住,这将向全世界开放软件包,因此请确保这是您想要的:

module my.module { opens com.my.package; }

所以,也许你不想向全世界开放你的包裹,那么你可以:
4.10. 打开…到
好吧,反射有时是很好的,但是我们仍然希望从封装中获得尽可能多的安全性。我们可以使用opens…to指令有选择地将包打开到预先批准的模块列表中,在这种情况下:
module my.module{打开com.my.package到moduleone、moduletwo等;}
因此,您最终创建了一个src/main/java/module-info.java类,如下所示:

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应用程序类和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目标。

相关问题