迁移到 JDK 11 + JavaFX 11,提供 RuntimeException

2022-09-03 07:38:45

我在Java 8 + JavaFX上有一个应用程序,我想迁移到Java 11。基础目标是为网络上的用户提供.jar,以便他们可以使用这个小应用程序。我使用JavaFX作为接口,sqlite-jdbc来生成数据库。

我有我的模块信息.java,编译似乎没问题:没有错误。但是如果我运行该应用程序,则会出现此错误:

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(QuantumRenderer.java:280)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:222)
    at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:260)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:409)
    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: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:94)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
    at java.base/java.lang.Thread.run(Thread.java:834)
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:272)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:409)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    ... 5 more

我的模块信息.java

module AutoGeneratorOpenData {
    requires javafx.base;
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.graphics;
    requires sqlite.jdbc;
    requires java.sql;
    requires java.desktop;

    exports autogeneratoropendata;
}

我在Windows 10 x64bits和JavaFX Windows SDK(最新版本11)上使用Netbeans 9。我没有使用Maven(但也许我必须这样做?

有什么想法可以解决这个问题吗?


答案 1

所以,有一些缺失的图书馆。

  • 在Windows上,javafx-sdk-11 / bin中缺少的DLL至少prism_d3d.dll,prism_sw.dll,javafx_font.dll,glass.dll;您可以将所有内容放入jdk目录(这不是最佳解决方案),或者放入自定义JRE的jlink目录中,在[...]\jlink\bin\ .C:\Program Files\Java\jdk[...]\bin

  • 在Linux上,javafx-sdk-11/lib中缺少的.so至少是libprism_es2.os,libprism_sw.so,libglass.so,libglassgtk3.so(libglassgtk2.so 对于旧配置可能也是如此),libjavafx_font.so,libjavafx_font_freetype.so,libjavafx_font_pango.so;例如,您可以将所有内容放入(这不是最佳解决方案中,或者放入自定义JRE的jlink目录中[...]。/jlink/lib ./usr/lib/jvm/java-11[...]/lib

  • 在 Mac 上,来自 jav javafx-sdk-11/lib 的缺少的 .dylib 必须是 (我想!) libprism_es2.dylib, libprism_sw.dylib, libglass.dylib, libjavafx_font.dylib [确认]。

要使用 jlink,您应该使用 jmods - 无需使用 librairy 文件。

我的模块信息.java并不完整:

module AutoGeneratorOpenData {
   requires sqlite.jdbc;
   requires javafx.controls;
   requires javafx.graphics;
   requires java.sql;
   requires java.desktop;
   requires javafx.fxml;
   requires javafx.base;    

   exports autogeneratoropendata;
   exports autogeneratoropendata.controller;    
   exports autogeneratoropendata.model;   
   exports autogeneratoropendata.util;

   opens autogeneratoropendata.controller;
}

现在它正在工作。


答案 2

在 Windows 上,更新了 PATH 变量以包含 javafx-sdk-11/bin。


推荐