IntelliJ can';我不能用OpenJDK11识别JavaFX11

IntelliJ can';我不能用OpenJDK11识别JavaFX11,java,intellij-idea,javafx,java-11,javafx-11,Java,Intellij Idea,Javafx,Java 11,Javafx 11,我很难让IntellJ识别JavaFX包。对于一个新的JavaFX项目,即OpenJDK11,当试图构建该项目时,IntelliJ无法识别JavaFX包 我已经从Maven repo导入了openjfx:javafx-base-11 我已经研究了其他问题,解决方案似乎包括检查字节码是否处于正确的级别(我的是),以及项目语言是否正确(我的是) 有人有什么想法吗 编辑: 错误: 如评论中所述,是从Java11和JavaFX11开始的地方 要像Java 11之前那样工作,关键是要理解: Jav

我很难让IntellJ识别JavaFX包。对于一个新的JavaFX项目,即OpenJDK11,当试图构建该项目时,IntelliJ无法识别JavaFX包

我已经从Maven repo导入了
openjfx:javafx-base-11

我已经研究了其他问题,解决方案似乎包括检查字节码是否处于正确的级别(我的是),以及项目语言是否正确(我的是)

有人有什么想法吗

编辑:

错误:


如评论中所述,是从Java11和JavaFX11开始的地方

要像Java 11之前那样工作,关键是要理解:

  • JavaFX11不再是JDK的一部分
  • 您可以以不同的方式获得它,无论是作为SDK还是作为 常规依赖项(maven/gradle)
  • 即使项目不是模块化的,也需要将其包含到项目的模块路径中
JavaFX项目

如果您在IntelliJ中创建常规JavaFX默认项目(没有Maven或Gradle),我建议您从下载SDK。注意,也有jmod,但对于非模块化项目,SDK是首选

以下是运行默认项目的简单步骤:

  • 创建JavaFX项目
  • 设置JDK 11(指向您的本地Java 11版本)
  • 将JavaFX11SDK添加为库。URL可能类似于
    /Users//Downloads/javafx-sdk-11/lib/
    。完成此操作后,您将注意到JavaFX类现在可以在编辑器中识别
  • 在运行默认项目之前,只需将以下选项添加到VM选项中:

    --module path/Users//Downloads/javafx-sdk-11/lib--add modules=javafx.controls,javafx.fxml

  • Maven

    如果使用Maven构建项目,请遵循以下步骤:

  • 使用JavaFX原型创建Maven项目
  • 设置JDK 11(指向您的本地Java 11版本)
  • 添加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>
    
    
    org.openjfx
    

    您会注意到Maven为您管理所需的依赖项:它将为javafx.controls添加javafx.base和javafx.graphics,但最重要的是,它将根据您的平台添加所需的分类器。就我而言,麦克

    这就是JAR
    org.openjfx:javafx控件:11
    为空的原因,因为有三种可能的分类器(windows、linux和mac平台),它们包含所有类和本机实现

    如果您仍然希望转到.m2 repo并手动从中获取依赖项,请确保选择正确的依赖项(例如
    .m2/repository/org/openjfx/javafx controls/11/javafx-controls-11-mac.jar

  • 将默认maven插件替换为来自的插件

  • 运行
    mvn编译javafx:Run
    ,它应该可以工作

  • 正如详细解释的,Gradle项目也有类似的工作

    编辑

    上述入门指南包含IntelliJ的更新项目和示例项目:

    • 没有Maven/Gradle的JavaFX11,请参阅或项目

    • JavaFX11与Maven,请参阅或项目

    • JavaFX11和Gradle,请参阅或项目


      • JavaFX不再是JDK 11的一部分的问题。 以下解决方案使用IntelliJ工作(尚未在NetBeans中尝试):

      • 将JavaFX全局库添加为依赖项:

        设置->项目结构->模块。在模块中,转到 “依赖项”选项卡,然后单击添加“+”符号->库->Java-> 从列表中选择JavaFX并单击添加选定项,然后应用设置

      • 右键单击JavaFX项目中的源文件(src),并创建一个新的 module-info.java文件。在文件中写入以下代码:

        module YourProjectName { 
            requires javafx.fxml;
            requires javafx.controls;
            requires javafx.graphics;
            opens sample;
        }
        
        我向您保证,这两个步骤将解决JavaFX的所有问题

      • 参考:学习编程频道制作了一个YouTube教程,将在5分钟内解释上述所有细节。我还建议您通过观看它来解决您的问题:
        以上这些都不适合我。我花了太多时间来清除出现的其他错误。我发现这是最简单也是最好的方法

        • 视频向您展示了JavaFXSDK下载
        • 如何将其设置为全局库
        • 设置模块info.java(我更喜欢底部的)



        整个过程只花了我5分钟

        快速总结,您可以执行以下任一操作:

      • 通过
        --模块路径
        --添加模块
        包含JavaFX模块,如José的答案中所示
      • 将JavaFX库添加到项目中后(手动或通过maven/gradle导入),添加与此答案中指定的文件类似的
        module info.java
        文件。(请注意,此解决方案使您的应用程序模块化,因此如果您使用其他库,您还需要在
        module info.java
        文件中添加语句以要求其模块)

      • 这个答案是对Jose答案的补充

        情况是这样的:

      • 您正在使用最新的Java版本,例如13
      • 您有一个JavaFX应用程序作为Maven项目
      • 在Maven项目中,按照Jose的回答配置了JavaFX插件并设置了JavaFX依赖项
      • 转到扩展应用程序的主类的源代码,右键单击它并尝试运行它
      • 在尝试启动应用程序时,您会收到一个包含“未命名模块”的
        IllegalAccessError
      • 试图从Intellij Idea运行JavaFX应用程序时生成
        IllegalAccessError
        的堆栈跟踪摘录:

        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
        
        所以,也许你不想打开你的
        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
        
        module my.module { opens com.my.package; }
        
        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;
        }
        
        module my.project {
            requires javafx.fxml;
            requires javafx.controls;
            opens my.project to javafx.graphics;
            exports my.project;
        }