运行 Windows 上的自定义 JRE 图像时,JavaFX 11 初始化 QuantumRenderer 时出错

JavaFX 11 Error intializing QuantumRenderer when running custom JRE image on Windows

我已经使用 JavaFX 11 构建了我的应用程序,现在我需要分发它。我选择以两种方式分发它:跨平台 fat-jar(我知道,我知道,这是不鼓励的,但这不是重点)和使用 jlink 创建的平台特定图像。

我正在 Linux Mint 20.1 上构建。我正在使用 Maven 并使用 javafx-maven-plugin 创建 运行 时间图像。我的 Linux 机器上有两个平台的 JDK,并指向 pom.xml 中相应的 jmods 文件夹。

内置的 fat-jar 适用于 Linux 和 Windows,两者都安装了最新的 Java SDK (11.0.12)。

Linux 的图像也可以正常工作。

但是,Windows 的图像没有 运行,-Dprism.verbose=true 的输出是这样的:

B:\Data\sjsm\releases.0\sjsm-1.0-win\bin>sjsm-1.0-launcher.bat                                                        Prism pipeline init order: d3d sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.d3d.D3DPipeline
GraphicsPipeline.createPipeline failed for com.sun.prism.d3d.D3DPipeline
java.lang.ClassNotFoundException: com.sun.prism.d3d.D3DPipeline
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Unknown Source)
at javafx.graphics/com.sun.prism.GraphicsPipeline.createPipeline(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
*** Fallback to Prism SW pipeline
Prism pipeline name = com.sun.prism.sw.SWPipeline
GraphicsPipeline.createPipeline failed for com.sun.prism.sw.SWPipeline
java.lang.UnsatisfiedLinkError: no prism_sw in java.library.path: [B:\Data\sjsm\releases.0\sjsm-1.0-win\bin, C:\WINDOWS\Sun\Java\bin, C:\WINDOWS\system32, C:\WINDOWS, C:\Program Files\Eclipse Foundation\jdk-11.0.12.7-hotspot\bin, C:\WINDOWS\system32, C:\WINDOWS, C:\WINDOWS\System32\Wbem, C:\WINDOWS\System32\WindowsPowerShell\v1.0\, C:\WINDOWS\System32\OpenSSH\, C:\Program Files\dotnet\, B:\xampp\php, B:\MinGW\bin, C:\Program Files\Microsoft SQL Server0\Tools\Binn\, B:\Git\cmd, B:\Matlab R2020a\bin, B:\Microsoft VS Code\bin, C:\Users\User\AppData\Local\Microsoft\WindowsApps, B:\xampp\php, ., .]
at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.base/java.lang.Runtime.loadLibrary0(Unknown Source)
at java.base/java.lang.System.loadLibrary(Unknown Source)
at javafx.graphics/com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(Unknown Source)
at javafx.graphics/com.sun.glass.utils.NativeLibLoader.loadLibrary(Unknown Source)
at javafx.graphics/com.sun.prism.sw.SWPipeline.lambda$static[=12=](Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.prism.sw.SWPipeline.<clinit>(Unknown Source)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Unknown Source)
at javafx.graphics/com.sun.prism.GraphicsPipeline.createPipeline(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Graphics Device initialization failed for :  d3d, 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(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.init(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
... 1 more
Exception in thread "main" java.lang.RuntimeException: No toolkit found
at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)

当我尝试从 Windows 上的源代码 运行 项目时,我得到了相同的响应。 (我把项目复制到Windows,装了maven,用javafx:run连运行都不会,更不用说用javafx:jlink的jlink了)

我在 Google 上尝试了很多链接,其中 none 有效,人们要么在他们的安装中缺少某些东西(我已经安装了至少我找到的所有东西)或者在不同的情况下会弹出问题(例如,当打包一个 fat-jar 时,或者 运行 从 IDE 安装他们的应用程序时)。

到目前为止我还没有尝试过从命令行手动创建图像,因为我读过很多次,与使用像 Maven 这样的构建工具相比,这是不鼓励的。

接下来我可以尝试什么?

java.lang.UnsatisfiedLinkError: no prism_sw in java.library.path

意味着您的库路径中肯定缺少一些 dll,尽管这可能只是问题的一部分。

当您从 this link 下载 javafx sdk for windows 时,您将获得具有以下结构的 zip:

bin 文件夹包含 运行 JavaFx(在 windows 或您下载 sdk 的平台)

所需的所有原生程序

请注意,您并不总是需要所有本机,例如 jfxwebkit.dll 只有在您使用 javafx-web 时才需要。

您需要将它们解压到某处,然后在 运行 java 程序

时将解压到的文件夹添加到库路径中
java "-Djava.library.path=path_to_natives" -classpath "your_classpath" <Your main class>

我已经设法解决了这个问题。 javafx-maven-plugin 期望在 <jModsPath> 中有一个冒号分隔的所有 jmod 路径列表,而不仅仅是标准的普通路径 JDK。它提取了我认为的 Maven 存储库中缺少的内容,但忽略了所有平台分类器。