The old Artifact is still kicking, not too long ago I created a Snap for it. Creating the Snap felt a bit like concocting a magical snapcraft.yaml and and hoping it works out. For the first few attempts the magic never works out, and the process of figuring things out tend to be tedious at best. This was no exception. Here are some of the problems I ran into, hope it helps someone else.
My first Snap attempt immediately spit out this during startup:
java.io.IOException: Cannot run program "/usr/bin/xprop": error=2, No such file or directory
This was fixed by adding these lines to my snapcraft.yaml. The layout is needed since xprop is referred to by an absolute path. See this thread for more information.
layout: /usr/bin/xprop: bind-file: $SNAP/usr/bin/xprop parts: mypart: stage-packages: - x11-utils
A xrandr puzzle
Next in line was this:
Exception in thread "main" java.lang.ExceptionInInitializerError at org.newdawn.slick.AppGameContainer$1.run(AppGameContainer.java:39) at java.security.AccessController.doPrivileged(Native Method) at org.newdawn.slick.AppGameContainer.<clinit>(AppGameContainer.java:36) at game.Artifact.main(Unknown Source) Caused by: java.lang.ArrayIndexOutOfBoundsException: 0 at org.lwjgl.opengl.LinuxDisplay.getAvailableDisplayModes(LinuxDisplay.java:951) at org.lwjgl.opengl.LinuxDisplay.init(LinuxDisplay.java:738) at org.lwjgl.opengl.Display.<clinit>(Display.java:138) ... 4 more
This was caused by xrandr not being installed in the snap, which LWJGL2 uses to find display stuff. This was fixed by adding the x11-server-utils package, which installs xrandr.
stage-packages: - x11-xserver-utils
For debugging snaps and finding packages these commands were great.
#This allows you to look at the system as seen from the snap snap run --shell <your-snapname> #This will give the package that installed an executable, in this case xrandr dpkg-query -S /bin/xrandr
I hope this helps someone else looking to get their application in a Snap.