1

As you probably guessed from the title, I'm trying to produce a deployable version for my JavaFX application. I've been able to compile to a JAR (through maven) and run it by specifying the path to javafx.controls. However, when I run the app after packaging the JAR with Jpackage (again specifying the path to javafx) I get a fatal RuntimeException (full stack trace below).

This is the code I've been using to try and get Jpackage working before using it on my full code (this file is 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();
    }
}

And I'm using this pom.xml (in the project root):

<?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>

I've been building the application into a JAR using mvn clean package.

The application runs fine if I run the created JAR (I'm not planning on distributing the JAR so having to specify a path to JavaFX isn't really an issue):

$ java --module-path $PATH_TO_FX --add-modules javafx.controls -jar HelloWorld-1.0-SNAPSHOT.jar

Now when I run jpackage on this JAR (specifically for a Linux app-image):

$ 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

Running the produced app image (./HelloWorld/bin/HelloWorld) produces this error:

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

The same error occurs if I create and install a deb file.

If it helps, I'm currently running Linux Mint 19, with Java 14.0.2 (downloaded from Adopt OpenJDK) and JavaFX 11.0.2.

I've found a few other places online with this error, but none of the solutions have worked (and mostly they have been unable to run the code at all).

I'm completely stuck and don't know where to go from here, so any help is really appreciated.

AvahW
  • 2,083
  • 3
  • 24
  • 30
  • Since you're using `$PATH_TO_FX` am I correct in assuming that points to a JavaFX SDK? If so, note the JAR files of the SDK do not embed the native code, unlike the JAR files from Maven Central. The cleanest option is to download the JMOD files [from Gluon](https://gluonhq.com/products/javafx/) and point to those—instead of the JAR files—when linking the JavaFX modules into a runtime image. – Slaw Jul 24 '20 at 22:20
  • @Slaw That solved it! Thank you! I can't believe it was such an easy fix. Would you mind posting that as an answer so that I can mark this as solved. – AvahW Jul 25 '20 at 07:54
  • 1
    With your confirmation of the solution, and by extension the problem, I decided to close this question as a duplicate. My answer to the other Q&A is basically the same as my comment here, just with a little more detail. – Slaw Jul 25 '20 at 09:35

0 Answers0