Java swing kiosk ubuntu classic snap

I am in the unenviable position of taking an existing Java Swing app and converting it into a kiosk application on an ubuntu 16 desktop. I reviewed the ubuntu kiosk docs:
https://ubuntu.com/tutorials/secure-ubuntu-kiosk#2-basic-infrastructure
It looks like I need to convert the Java into a snap and use Case #2 (To enable these applications we will embed a tiny X11 server into your application package, which translates X11 calls to Wayland ones.)
I’ve spent some time on this and have gotten the snap to run using the mir-kios-snap-launch example. But I’m getting:
Java.io.IOException: Cannot run program “/usr/bin/xprop”: error=2, No such file or directory.
I assume it’s because I have not managed to get the X11 server configured correctly.

If there’s any examples or anything I would appreciate any help on this.

Here is my snapcraft.yaml:

name: java-test
description: java test
summary: This is the summary
version: "1.0"
base: core18
grade: devel
confinement: devmode
apps:
  daemon:
    command-chain:
      - bin/run-daemon
      - bin/wayland-launch
    daemon: simple
    restart-condition: always
    command: bin/jt/data/jt.sh
  jt-start:
    command-chain:
      - bin/wayland-launch
    command: bin/jt/data/jt.sh
    environment: 
      JAVA_HOME: $SNAP/usr/lib/jvm/java-1.8.0-openjdk-$SNAP_ARCH
      PATH: $JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
    plugs: [wayland, network, opengl, unity7]
parts:
  jt-start:
    plugin: dump
    source: .
    organize:
      jt/: bin/jt/
    stage-packages: [openjdk-8-jre, openjdk-8-demo]
  mir-kiosk-snap-launch:
    plugin: dump
    source: https://github.com/mir-kiosk-apps/mir-kiosk-snap-launch.git
    override-build:  $SNAPCRAFT_PART_BUILD/build-with-plugs.sh opengl pulseaudio wayland
    stage-packages:
      - inotify-tools

Also not sure on how to put code in here? It’s eating up my yaml file.

That bit I can help with: put a line with three backquotes (`) before and after.

It isn’t down to the way you’ve configured X, but because something in Java is trying to run /usr/bin/xprop and that’s not something that should be done in a confined snap (because programs from the snap are elsewhere, e.g. $SNAP/usr/bin/xprop.

But I don’t know how to change what your Java application is doing.

Thanks for sorting out the formatting, mir-kiosk-snap-launch is shown in the “native Wayland” tutorial.

Have you tried following the tutorial for an X11 application?

https://ubuntu.com/tutorials/x11-kiosk#1-overview

that’s what I’m about to look at. It spends alot of time with egmde and I wasn’t sure if that was production level or I should stick with the mir-kiosk

:question: I don’t see any mention of egmde.

Are we talking about the same things? https://ubuntu.com/tutorials/x11-kiosk#4-first-pass-snapping-test-on-desktop

At the bottom:
You should be left with a “mir-kiosk-x11-example_0.1_amd64.snap” file.

Let’s test it!

egmde&
sudo snap install --dangerous ./mir-kiosk-x11-example_0.1_amd64.snap
mir-kiosk-x11-example

Hold on this is you: https://github.com/AlanGriffiths/egmde :sweat_smile:

You’re right. It does use egmde for the initial tests. How could I miss that!?

It is safe for you to do this, but I should find a way to make this less confusing.

I spent some time refactoring playing with the examples. Right now I’m getting the following error starting my Java program. I hope the error is maybe I’m on a VM? Weird drivers, etc and I hope it will disappear on the deployment HW(It’s also Ubuntu 16 :slightly_frowning_face:)

[2021-05-25 14:18:13.835038] mirserver: Starting [2021-05-25 14:18:13.838580] < - debug - > mirserver: Not trying logind: “DISPLAY” is set and X need not have claimed the VT [2021-05-25 14:18:13.838807] < - debug - > mirserver: Not using Linux VT subsystem for session management: Failed to find the current VT [2021-05-25 14:18:13.838836] < - debug - > mirserver: No session management supported [2021-05-25 14:18:13.841468] VT switch key handler: No VT switching support available: MinimalConsoleServices does not support VT switching [2021-05-25 14:18:13.841701] mircommon: Loading modules from: /snap/mpcad/x1/usr/lib/x86_64-linux-gnu/mir/server-platform [2021-05-25 14:18:13.841761] mircommon: Loading module: /snap/mpcad/x1/usr/lib/x86_64-linux-gnu/mir/server-platform/graphics-wayland.so.19 [2021-05-25 14:18:13.841806] mirserver: Found graphics driver: mir:wayland (version 2.3.3) Support priority: 256 [2021-05-25 14:18:13.841823] mirserver: Selected driver: mir:wayland (version 2.3.3) ERROR: /build/mir-ugCfbK/mir-2.3.3/src/server/graphics/default_configuration.cpp(136): Throw in function mir::DefaultServerConfiguration::the_graphics_platform()::<lambda()> Dynamic exception type: boost::wrapexcept<std:: runtime_error> std::exception::what: Exception while creating graphics platform ERROR: /build/mir-ugCfbK/mir-2.3.3/src/platforms/wayland/platform.cpp(40): Throw in function mir::graphics::wayland::Platform::Platform(wl_display*, const std::shared_ptr<mir:: graphics::DisplayReport>&) Dynamic exception type: boost::wrapexcept<std:: system_error> std::exception::what: Failed to connect to wayland: EGL_SUCCESS (0x3000)

I can see that the server you have included detects a Wayland host and tries to connect. But then fails without providing any clue why.

It might be “weird drivers”, or not.

Here’s a recent guide to debugging in a VM:

HTH