【问题标题】:JavaFX 11 Error intializing QuantumRenderer when running custom JRE image on Windows在 Windows 上运行自定义 JRE 图像时,JavaFX 11 初始化 QuantumRenderer 时出错
【发布时间】:2021-12-04 10:02:27
【问题描述】:

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

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

构建的 fat-jar 可以在安装了最新 Java SDK (11.0.12) 的 Linux 和 Windows 上运行。

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

但是,Windows 的映像无法运行,-Dprism.verbose=true 的输出是这样的:

B:\Data\sjsm\releases\1.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\1.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 Server\120\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$0(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$2(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$2(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)

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

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

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

接下来我可以尝试什么?

【问题讨论】:

  • (除此之外:内联格式like so 只需要单个反引号。三个反引号用于块格式)。
  • 我可能是错的,但我认为库路径中缺少用于 Windows 的 javafx 本机(一堆 dll 文件)
  • 在我在互联网上发现的一个链接中,有人遇到了同样的错误,他们的问题是他们缺少 MS API dll。我已经检查过了,他们都在场。但是我没有找到应该存在的所有 dll 的列表,所以我无法检查。

标签: windows maven javafx jlink


【解决方案1】:

java.lang.UnsatisfiedLinkError:java.library.path 中没有 prism_sw

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

当您从this link 下载适用于 windows 的 javafx sdk 时,您会得到一个具有以下结构的 zip:

bin 文件夹包含运行 JavaFx 所需的所有本机(在 Windows 上,或您下载 sdk 的平台上)

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

当你运行java程序时,你需要将它们解压到某个地方,并将你解压到的文件夹添加到库路径中

java "-Djava.library.path=path_to_natives" -classpath "your_classpath" <Your main class>

【讨论】:

  • 我正在使用无法从 gluon 免费下载的 JavaFX 11(或者至少我没有找到方法)。此外,我正在使用 Maven,因此我希望它能够下载 JavaFX 的所有必要依赖项
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2019-12-25
    相关资源
    最近更新 更多