【问题标题】:Is it possible to run JavaFX with Java 11 on M1 Mac?是否可以在 M1 Mac 上使用 Java 11 运行 JavaFX?
【发布时间】:2023-02-21 03:36:11
【问题描述】:

在过去的几天里,我一直在尝试在我的 M1 Mac 上设置 JavaFX。我能够使用 Java 18 让它工作,但不幸的是我需要在学校使用 Java 11。

我一直收到以下错误:

Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:283)
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:254)
        at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:264)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
        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: Error initializing QuantumRenderer: no suitable pipeline found
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:95)
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
        at java.base/java.lang.Thread.run(Thread.java:829)
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: No toolkit found
        at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:276)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
        ... 5 more

我尝试使用以下 JavaFX 版本的各种组合:

javafx-sdk-11

javafx-sdk-11.0.2

javafx-sdk-17.0.2

javafx-sdk-18

以及以下 Java JDK 版本:

铁木林-11.jdk

zulu-11.jdk

但我尝试过的任何事情都没有给我带来任何成功。我知道我已经正确安装了所有东西(更新运行配置等),所以我认为这不是问题。我尝试过使用 VSCode、Eclipse 和 IntelliJ,但它们的结果都是一样的。

甚至可以在 M1 Mac 上使用 Java 11 运行 JavaFX 还是我运气不好?提前致谢。

【问题讨论】:

    标签: java javafx java-11 apple-m1


    【解决方案1】:

    我没有要测试的 M1 Mac,但您是否尝试过 Azul 提供的带有 JavaFX 的 JDK 11 构建?我看到您提到了 zulu-11,只是不确定您是否选择了捆绑了 JavaFX 的版本。

    请务必在下载页面的各种弹出菜单中选择“macOS”、“ARM 64-bit”和“JDK FX”。

    https://www.azul.com/downloads/?version=java-11-lts&os=macos&architecture=arm-64-bit&package=jdk-fx

    【讨论】:

    • 这解决了我的问题,非常感谢
    【解决方案2】:

    使用最低 JavaFX 版本 17.0.2

    我不建议尝试在 M1 Mac 上使用 JavaFX 11。

    正如 swpalmer in his answer 所指出的,有一个包含 JavaFX 的 Azul JDK FX Java 11 LTS 发行版。

    然而,一些早期版本的 JavaFX 是为 M1 mac 编码的,但它们崩溃了,请参阅引用的问题和相关的错误报告(JavaFX 错误跟踪器 wiki 中的崩溃有很多):

    有可能所有相关修复都反向移植到 Azul JDK FX 11 LTS 版本,但我不会依赖它。

    查看JavaFX modules in Maven for the 11.0.2 release时,没有支持M1架构的模块。此外,no JavaFX 11 modules and no JavaFX 11 SDK 可从支持 M1 架构的 Gluon 下载。

    相反,我建议使用适用于最新 Mac M1 系统和 Mac 操作系统的已知良好版本,即 JDK 17+ 和 JavaFX 17.0.2+。相应的下载很容易获得:

    请参阅有关在构建环境中安装和使用这些发行版的相关文档(在 openjfx.io、Zulu 或您的 IDE 提供商处)。

    将最新的 JavaFX 版本与旧的 JDK 混合

    您可以在较旧的 JDK 上运行 JavaFX 17.0.2+,但我建议使用每个 JDK 的最新版本。

    我已经在 Intel Mac 上尝试过这样的组合(例如 JDK 11 上的 JavaFX 17.0.2)并且它们运行良好,但我没有在 M1 Mac 上尝试过这些组合,因为我没有。

    我在此答案中链接的资源中提供了支持 M1 mac(aarch64 架构)的 JavaFX 17.0.2+。

    支持 M1 mac(aarch64 架构)的 JDK 11 和 JRE 11 可从各种供应商处获得(请咨询您的 JDK 或 JRE,例如 Zulu 或 Liberica,发行版供应商以查看这些发行版在您的平台上的安装说明)。

    使用最新的 JavaFX 版本时图形管道失败

    您注意到您尝试了以下发行版:

    javafx-sdk-17.0.2 javafx-sdk-18

    它对你不起作用(报告“找不到合适的管道”)。

    我没有 M1 mac 来尝试验证这一点。

    我不知道最新的 JavaFX 版本不适合您的原因。也许您正在尝试使用 SDK 的 Intel 架构版本(例如 x64)而不是 SDK 的 M1 兼容架构版本(例如 aarch64)。

    JavaFX 18 release notes 包括在发布 JDK-8278595 Provide more information when a pipeline can't be used 中实现的增强功能。我想这对解决这个问题没有帮助;-)

    【讨论】:

      【解决方案3】:

      te 问题是 javafx-controls 的版本,在 pom xml 中,因为默认情况下 maven 使用英特尔版本,所以将版本更改为 20-ea+11,并下载正确的版本。

      <dependency>
          <groupId>org.openjfx</groupId>
          <artifactId>javafx-controls</artifactId>
          <version>20-ea+11</version>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 2021-06-13
        • 2021-11-24
        • 1970-01-01
        • 2011-04-10
        • 2021-03-10
        相关资源
        最近更新 更多