【发布时间】:2019-03-29 20:29:26
【问题描述】:
我有一个基于 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 x64 位和 JavaFX Windows SDK(最新版本 11)上使用 Netbeans 9。我没有使用 Maven(但也许我必须?)。
有办法解决这个问题吗?
【问题讨论】:
-
你确定这是Java11吗?如:stackoverflow.com/questions/21185156/… ...这个问题似乎经常出现。这也可能是应该运行 JavaFx 应用程序的操作系统的问题!所以这里不要关注 JVM 版本。除非应用程序在 Java8 的同一台机器上工作,但在 java11 上失败。
-
尝试使用
-Dprism.verbose=true运行,看看是否能提供有关问题的更多信息。这确实不是 JavaFX 11 特有的新问题,但它发生的原因有很多。 -
我遇到了同样的问题。有一个 JavaFX SDK 可供下载。在这个档案中有一个 bin 文件夹。在这个 bin 文件夹中有很多需要的 dll 和其他文件。在 Java 8 中,它们自动位于 bin 文件夹中。这些附加文件必须位于应用程序可以找到它们的路径上。
-
顺便问一下你用的是哪个罐子?如果我查看 Maven 存储库,就会发现特定于操作系统的 jar 中可能包含必要的本机库。我不敢相信您需要手动设置 natives 目录,没有任何文档提及需要这样做。
-
@GhostCat 确实是 Java 11,我确定(在我的项目属性、源代码和库中选择了 JDK 11)。