是否有可能 运行 JavaFX 与 Java 11 在 M1 Mac 上?

Is it possible to run JavaFX with Java 11 on M1 Mac?

在过去的几天里,我一直在尝试在我的 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 版本:

temurin-11.jdk

祖鲁-11.jdk

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

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

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

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

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

使用最低 JavaFX 版本 17.0.2

我不建议在 M1 Mac.

上尝试使用 JavaFX 11

正如 所指出的,有一个 Azul JDK FX Java 11 LTS 发行版,其中包括 JavaFX。

然而,JavaFX 的一些早期版本被编码为 M1 macs,但它们崩溃了,请参阅参考问题和相关错误报告(在 JavaFX 错误跟踪器 wiki):

  • Why do I keep getting this SIGBUS error code on my MacOS when trying to run a JavaFx Project on Netbeans?

可能所有相关修复都是 back-ported Azul JDK FX 11 LTS 版本,但我不会依赖它。

检查 JavaFX modules in Maven for the 11.0.2 release, there are no modules that support the M1 architecture. Also, there are no JavaFX 11 modules and no JavaFX 11 SDK 可从支持 M1 架构的 Gluon 下载时。

相反,我建议使用适用于最新 Mac M1 系统和 Mac 操作系统的已知良好版本,即 JDK 17+ 和 Java外汇 17.0.2+。对应的下载一应俱全:

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

将最新的 JavaFX 版本与旧的 JDKs

混合

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

我已经在 Intel Macs 上尝试过这样的组合(例如 JDK11 上的 JavaFX 17.0.2)并且它们工作正常,但我没有在 Macs 上尝试过这些组合M1 Mac 因为我没有。

JavaFX 17.0.2+ 支持 M1 macs(aarch64 架构)可在我在此答案中链接的资源中获得。

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

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

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

javafx-sdk-17.0.2 javafx-sdk-18

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

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

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

JavaFX 18 release notes include an enhancement implemented in the release JDK-8278595 Provide more information when a pipeline can't be used。我想这对解决这个问题没有帮助 ;-)