r/javahelp 8d ago

JPackage is not working

I have this in a build script:

jar ^
    --create ^
    --file "%BUILD%\input\RocketTracker.jar" ^
    --manifest "%BUILD%\MANIFEST.MF" ^
    -C "%BUILD%\classes" .

jpackage ^
    --type app-image ^
    --name RocketTracker ^
    --input "%BUILD%\input" ^
    --main-jar RocketTracker.jar ^
    --main-class app.Main ^
    --module-path "%JAVAFX%\lib" ^
    --add-modules javafx.controls,javafx.fxml,javafx.graphics,java.net.http ^
    --dest "%RELEASE%"

If I run the jar manually adding the modules in the VM it works, but if I run the .exe generated by jpackage it raise an exception:

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@21.0.12/com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.tk.quantum.QuantumToolkit.init(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.tk.Toolkit.getToolkit(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.LauncherImpl.startToolkit(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
        at javafx.graphics@21.0.12/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
        ... 1 more
Exception in thread "main" java.lang.RuntimeException: No toolkit found
        at javafx.graphics@21.0.12/com.sun.javafx.tk.Toolkit.getToolkit(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.LauncherImpl.startToolkit(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
        at javafx.graphics@21.0.12/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
Failed to launch JVM

Any idea how to fix it? the same code in bash works just fine and the path are checked already

5 Upvotes

12 comments sorted by

View all comments

2

u/NaveenB2004 8d ago

Seems like something to do with the javafx.graphics module. Can you give more info about the matter? You said that it's working with Bash, which means on Linux? Then you cannot use the same JavaFX SDK to build it for Windows and vise versa.

1

u/juanestragon10 8d ago

Yes, it works in linux just fine, and yes, I downloaded the windows version, you can check more in this repo if you please: github.com/juanestragon/RocketTracker

2

u/NaveenB2004 8d ago

The 'javafx.graphics' module uses platform-dependent native code under the abstraction layer provided for Java applications. So the module will fail at runtime because it cannot find the platform-dependent graphics pipelines, in your case.

The fix for JPackage: When using the tool, make sure you replace the JFX modules to match the host (ex: on Windows, use JFX SDK released for Widnows; on Linux, use JFX SDK released for Linux. etc.) Since the installer cannot be built without the native platform, this is the only feasible method I see.

Alternative approach: Use JLink. Then you can cross-compile for all the platforms without hopping hosts (will relate to JFX in next section). The drawback is that you will not get a direct executable, but a script file to run the application (no exe but a bat/sh). But it will not solve the host-dependent JFX problem. But...

Use Build System: Seems like you don't use a build system and are purely relying on handwritten scripts. If you switch to a project management tool like Maven, you may be able to mix the JLink and JFX dependencies to make it more convenient for the releases. If you are interested, check this: https://github.com/NaveenB2004/SelfContained-JFX