16

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

我有我的 module-info.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(但也许我必须?)。

有什么办法解决这个问题吗?

4

5 回答 5

6

因此,缺少一些库。

  • 在 Windows 上,javafx-sdk-11/ bin中缺少的 DLL 至少为 prism_d3d.dll、prism_sw.dll、javafx_font.dll、glass.dll;您可以将所有内容放入 jdk 目录C:\Program Files\Java\jdk[...]\bin这不是最好的解决方案,或者放入自定义 JRE 的 jlink 目录,在[...]\jlink\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;您可以将所有内容放入/usr/lib/jvm/java-11[...]/lib示例中(这不是最佳解决方案,或放入自定义 JRE 的 jlink 目录中[...]/jlink/lib

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

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

而且我的 module-info.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;
}

现在它正在工作。

于 2018-10-26T09:20:08.147 回答
4

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

于 2019-05-09T20:06:18.027 回答
0

您还可以使用:

System.setProperty("java.library.path", "path/to/javafx-sdk-11.0.x/lib");

path/to/javafx-sdk-11.0.x/libJavaFX 的 lib(或对于 Windows,bin)目录的路径在哪里。

请注意,如果 JavaFX 应用程序是从辅助类启动的,则此技术将起作用。直接从它自己的类启动JavaFX 应用程序需要module-info.java从JDK9 开始的模块系统(例如,等等)。

于 2020-03-13T16:06:16.537 回答
0

还应该注意的是,如果您使用的是 Eclipse(我知道您不是在这种情况下)和 Maven,如果您尝试为特定于平台的 javafx-graphics 库(win、mac、linux)添加依赖项,则会导致此问题通过maven构建。我不完全确定为什么。

在我刚刚删除 pom 中依赖于平台的依赖项并最终运行之前,我正试图在目标中做一个干净的 javafx:ru​​n 。

于 2019-09-20T15:45:37.000 回答
0

请使用最新的 JavaFX 版本,许多错误已得到解决

<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-fxml</artifactId>
    <version>15</version>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-controls</artifactId>
    <version>15</version>
</dependency>
于 2021-01-04T13:30:20.083 回答