I am attempting to run a Java JAR application via a Container being ran by Podman using Debian 11. I downloaded the free Worldographer JAR from their website. I launch the container using the following commands.
#!/usr/bin/env bash
podman run \
--rm \
-it \
--network=host \
--env=DISPLAY \
--volume="/tmp/.X11-unix:/tmp/.X11-unix" \
--volume="$(pwd):/app" \
--workdir="/app" \
docker.io/library/openjdk:17.0.1-bullseye \
/bin/bash
Then inside the container I install the following packages.
apt update
apt install --yes libxext6 libxrender1 libxtst6 openjfx
I then run the application with the following command.
java -Djavafx.verbose=true -Dprism.verbose=true -Xmx4G -Dprism.maxvram=3G -jar worldographer.jar
The application window appears, but there are missing buttons other than the header.
I get the following errors.
root@pop-os:/app# java -Djavafx.verbose=true -Dprism.verbose=true -Xmx4G -Dprism.maxvram=3G -jar worldographer.jar
Prism pipeline init order: es2 sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
GraphicsPipeline.createPipeline failed for com.sun.prism.es2.ES2Pipeline
java.lang.ClassNotFoundException: com.sun.prism.es2.ES2Pipeline
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:218)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:91)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
at java.base/java.lang.Thread.run(Thread.java:833)
*** Fallback to Prism SW pipeline
Prism pipeline name = com.sun.prism.sw.SWPipeline
WARNING: java.lang.UnsatisfiedLinkError: Can't load library: /app/libprism_sw.so
GraphicsPipeline.createPipeline failed for com.sun.prism.sw.SWPipeline
java.lang.UnsatisfiedLinkError: no prism_sw in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2429)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818)
at java.base/java.lang.System.loadLibrary(System.java:1989)
at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:163)
at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:53)
at com.sun.prism.sw.SWPipeline.lambda$static$0(SWPipeline.java:42)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
at com.sun.prism.sw.SWPipeline.<clinit>(SWPipeline.java:41)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:218)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:91)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
at java.base/java.lang.Thread.run(Thread.java:833)
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 com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)
at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:244)
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:261)
at javafx.scene.image.Image.loadImage(Image.java:1078)
at javafx.scene.image.Image.initialize(Image.java:813)
at javafx.scene.image.Image.<init>(Image.java:703)
at com.inkwellideas.ographer.model.TerrainType.setupDefaults(TerrainType.java:111)
at com.inkwellideas.ographer.model.Terrain.<clinit>(Terrain.java:16)
at com.inkwellideas.ographer.ui.Worldographer.main(Worldographer.java:12960)
at com.inkwellideas.ographer.ui.Launcher.main(Launcher.java:122)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:94)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
at java.base/java.lang.Thread.run(Thread.java:833)
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.inkwellideas.ographer.ui.Worldographer.main(Worldographer.java:12960)
at com.inkwellideas.ographer.ui.Launcher.main(Launcher.java:122)
Caused by: java.lang.RuntimeException: No toolkit found
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:273)
at javafx.scene.image.Image.loadImage(Image.java:1078)
at javafx.scene.image.Image.initialize(Image.java:813)
at javafx.scene.image.Image.<init>(Image.java:703)
at com.inkwellideas.ographer.model.TerrainType.setupDefaults(TerrainType.java:111)
at com.inkwellideas.ographer.model.Terrain.<clinit>(Terrain.java:16)
... 2 more
Is there something else I'm missing? This also happens when I run it in a Flatpak Sdk and enabling the OpenJDK Extension. So, there is something I'm missing.
--EDIT 2021-12-13--
I found some links to running something with JavaFX. So, using the following steps, I am able to get a new error.
I added --volume="/tmp:/tmp" to the podman run command.
apt update
apt install --yes libxext6 libxrender1 libxtst6 openjfx
curl --location -O https://download2.gluonhq.com/openjfx/17.0.1/openjfx-17.0.1_linux-x64_bin-sdk.zip
unzip openjfx-17.0.1_linux-x64_bin-sdk.zip
export JAVA_JFX=/app/javafx-sdk-17.0.1/lib
java -Djavafx.verbose=true \
-Dprism.verbose=true \
-Xmx4G \
-Dprism.maxvram=3G \
--module-path $JAVA_JFX \
--add-modules javafx.controls \
-jar worldographer.jar
The error I now get is:
(java:2472): dbind-WARNING **: 05:19:06.156: Couldn't register with accessibility bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
Gtk-Message: 05:19:06.178: Failed to load module "canberra-gtk-module"
Gtk-Message: 05:19:06.179: Failed to load module "canberra-gtk-module"
vsync: true vpipe: false
Loaded /app/javafx-sdk-17.0.1/lib/./libjavafx_font.so from relative path
Loaded /app/javafx-sdk-17.0.1/lib/./libjavafx_iio.so from relative path
Loaded /app/javafx-sdk-17.0.1/lib/./libjavafx_font_freetype.so from relative path
Loaded /app/javafx-sdk-17.0.1/lib/./libjavafx_font_pango.so from relative path
Exception in Application start method
QuantumRenderer: shutdown
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.sg.prism.web.NGWebView (in unnamed module @0x6399870c) cannot access class com.sun.javafx.sg.prism.NGGroup (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.sg.prism to unnamed module @0x6399870c
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at com.inkwellideas.ographer.ui.Worldographer.showLicenseDialog(Worldographer.java:574)
at com.inkwellideas.ographer.ui.Worldographer.start(Worldographer.java:476)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:290)