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

时间:2018-10-25 09:16:47

标签: java javafx javafx-11

我有一个要迁移到Java 11的Java 8 + JavaFX应用程序。其基本目的是为网络上的用户提供.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

我的module-info.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 x64位和 JavaFX Windows SDK (最新版本11)上使用Netbeans 9。我不使用Maven(但也许必须?)。

有什么想法要解决吗?

5 个答案:

答案 0 :(得分:2)

因此,有一些遗漏的库。

  • 在Windows上,javafx-sdk-11 / bin 中缺少的DLL至少是pyramid_d3d.dll,prism_sw.dll,javafx_font.dll,glass.dll;您可以将其全部放入jdk目录C:\Program Files\Java\jdk[...]\bin这不是最佳解决方案,也可以将其放入[...]\jlink\bin\

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

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

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

我的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;
}

现在可以使用了。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我只是想撞墙,试图做一个干净的javafx:在我删除pom中依赖于平台的依赖项并最终运行之前,在目标中运行。

答案 3 :(得分:0)

您还可以使用:

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

path/to/javafx-sdk-11.0.x/lib是JavaFX的lib(或Windows,bin)目录的路径。

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

答案 4 :(得分: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>