java - 运行 jpackage 后运行 JavaFX 应用程序时出现“图形设备初始化失败”?
问题描述
正如您可能从标题中猜到的那样,我正在尝试为我的 JavaFX 应用程序生成一个可部署的版本。我已经能够编译为 JAR(通过 maven)并通过指定javafx.controls
. 但是,当我在使用 Jpackage 打包 JAR(再次指定 javafx 的路径)后运行应用程序时,我得到一个致命的 RuntimeException(下面的完整堆栈跟踪)。
这是我一直用来尝试让 Jpackage 在我的完整代码上使用它之前工作的代码(这个文件是src/main/java/sample/Main.java
):
package sample;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane root = new BorderPane();
root.setCenter(new Label("Hello, World!"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
}
我正在使用它pom.xml
(在项目根目录中):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Hello</groupId>
<artifactId>HelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>sample.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
</properties>
</project>
我一直在使用mvn clean package
.
如果我运行创建的 JAR,应用程序运行良好(我不打算分发 JAR,因此必须指定 JavaFX 的路径并不是真正的问题):
$ java --module-path $PATH_TO_FX --add-modules javafx.controls -jar HelloWorld-1.0-SNAPSHOT.jar
现在,当我在这个 JAR 上运行 jpackage 时(特别是对于 Linux 应用程序映像):
$ jpackage --type app-image -n HelloWorld -i . --main-class sample.Main --main-jar HelloWorld-1.0-SNAPSHOT.jar --module-path $PATH_TO_FX --add-modules javafx.controls
WARNING: Using incubator modules: jdk.incubator.jpackage
$ chmod +x Hello/bin/Hello
运行生成的应用映像 ( ./HelloWorld/bin/HelloWorld
) 会产生以下错误:
Graphics Device initialization failed for : es2, 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.launchApplicationWithArgs(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(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)
at java.base/java.lang.Thread.run(Unknown Source)
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(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: 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.launchApplicationWithArgs(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
... 5 more
HelloWorld Failed to launch JVM
如果我创建并安装deb
文件,也会发生同样的错误。
如果有帮助,我目前正在运行 Linux Mint 19、Java 14.0.2(从Adopt OpenJDK下载)和 JavaFX 11.0.2。
我在网上发现了一些其他地方出现此错误,但没有一个解决方案有效(而且大多数情况下他们根本无法运行代码)。
我完全被困住了,不知道从哪里开始,所以非常感谢任何帮助。
解决方案
推荐阅读
- javascript - Eloquent JS:电子生活项目问题
- embedded - USB CDC:STM32F103RBT6 无法显示 USB 设备
- sql - 在 SQL Server 2016 中按子句排序的单个案例中的多列
- php - 如何从以@开头的字符串中获取数组并以字符串中的空格结尾
- java - SonarQube + 报告中未显示的依赖模块中的聚合覆盖率或覆盖率由 Jacoco 生成
- ios - ios - Xcode 10:Razorpay pod“使用 Swift 4.1 编译的模块无法由 Swift 4.2 编译器导入”
- python - 如何在 Python 3.7+ 中定义循环依赖的数据类?
- ios - 在 Swift 3 中单击处于终止/关闭状态的推送通知时,应用程序未打开
- python - 同时创建一个与数据中最长列长度相同的列
- visual-studio-2017 - VS 2017 Extension - 添加自定义解决方案菜单项