Java-Wrapper für Linux

Um Java-Programme für Enduser halbwegs startbar zu machen sind JARs mit korrektem Manifest ja ganz nett, aber leider muss man hin und wieder auch VM-Argumente mit angeben, was über diese Weg nicht möglich ist.

One-Jar, wofür ich immerhin schon einen Patch geschrieben habe um es meinen Bedürfnissen weiter anzupassen, erübrigt wenigstens das Problem mit den vielen JARs von Zusatzbibliotheken.

Unter Windows kann man dann Launch4J nutzen um diese einzelne JAR-Datei in eine EXE-Datei zu verwandeln.
Etwas passendes gibt es für Linux (meines Wissens nach) leider nicht.
Glücklicherweise ist mit Scripten viel möglich 😛 : Nach Lesen dieses Posts habe ich das Script etwas weiter angepasst:

  1. #!/bin/sh
  2. ##################################################################
  3. #Set application name
  4. appName=beamer-tool_admin
  5. # Define minimum java version
  6. minJavaVersionMajor=1
  7. minJavaVersionMinor=5
  8. minJavaVersionPatch=2
  9. # env var $JAVA_OPTS is set with default values if not set
  10. defaultJAVA_OPTS='-Xms32M -Xmx384M -Djava.net.preferIPv4Stack=true'
  11. ##################################################################
  12.  
  13. ##################################################################
  14. showmessage() {
  15. #Use KDE dialog
  16. if [ $DE = "kde" ]; then
  17. kdialog -title "$0" --error "$1"
  18. #Use Gnomes dialog
  19. elif [ $DE -eq "gnome" ]; then
  20. zenity --title "$0" --error --text="$1"
  21. #Fallback for other DE
  22. else
  23. xmessage -center "$1"
  24. fi
  25. }
  26.  
  27. ###################################################################
  28. #Detect DE for future message showings
  29. if [ $KDE_FULL_SESSION = "true" ]; then
  30. DE=kde;
  31. elif [ $GNOME_DESKTOP_SESSION_ID != "" ]; then
  32. DE=gnome;
  33. else
  34. DE=x;
  35. fi
  36. ###################################################################
  37. #Detect Java and Java Opts
  38. JAVA=java
  39. if [ -n "$JAVA_HOME" ]; then
  40. JAVA="$JAVA_HOME/bin/java"
  41. fi
  42. # check JAVA_OPTS and set with defaults if not set
  43. if [ -z "$JAVA_OPTS" ]; then
  44. JAVA_OPTS=$defaultJAVA_OPTS
  45. fi
  46.  
  47. echo '#############################################'
  48. echo ' Java Discovery:'
  49. if ( which $JAVA 2>&1 > /dev/null ); then
  50. echo `which $JAVA`
  51. else
  52. echo 'Cannot find Java. Please install or correct your JAVA_HOME'
  53. showmessage "Cannot find Java.\nPlease install or correct your JAVA_HOME!"
  54. exit 2
  55. fi
  56.  
  57. echo ''
  58. #####################################################################
  59. #Detect Java version and check it
  60. #create tmp file name
  61. tmpJavaVersion=mktemp
  62. # query complete version by java
  63. java -version 2>&1 | head -n 1 > $tmpJavaVersion
  64. # clean output
  65. javaVersion=`awk 'BEGIN {FS = "\""} {print $2}' $tmpJavaVersion`
  66. # split version parts
  67. javaVersionMajor=`awk 'BEGIN {FS = "."} {print $1}'` << EOF
  68. $javaVersion
  69. EOF
  70. javaVersionMinor=`awk 'BEGIN {FS = "."} {print $2}'` << EOF
  71. $javaVersion
  72. EOF
  73. javaVersionPatch=`awk 'BEGIN {FS = "."} {print $3}'` << EOF
  74. $javaVersion
  75. EOF
  76. javaVersionPatch=`awk 'BEGIN {FS = "_"} {print $1}'` << EOF
  77. $javaVersionPatch
  78. EOF
  79. ######################################################################
  80. # Print found java version
  81. echo '#############################################'
  82. echo ' Java Version:'
  83. echo "Found version:    $javaVersionMajor.$javaVersionMinor.$javaVersionPatch"
  84. echo "Required version: $minJavaVersionMajor.$minJavaVersionMinor.$minJavaVersionPatch"
  85. if [ $javaVersionMajor -gt $minJavaVersionMajor ]; then
  86. echo -n ''
  87. else
  88. if [ $javaVersionMajor -eq $minJavaVersionMajor ] &&
  89. [ $javaVersionMinor -gt $minJavaVersionMinor ]; then
  90. echo -n ''
  91. else
  92. if [ $javaVersionMajor -eq $minJavaVersionMajor ] &&
  93. [ $javaVersionMinor -eq $minJavaVersionMinor ] &&
  94. [ $javaVersionPatch -ge $minJavaVersionPatch ]; then
  95. echo -n ''
  96. else
  97. echo "Please update your Java to the required Java version $minJavaVersionMajor.$minJavaVersionMinor.$minJavaVersionPatch"
  98.  
  99. showmessage "Please update your Java to the required Java version $minJavaVersionMajor.$minJavaVersionMinor.$minJavaVersionPatch.\nYour version $javaVersionMajor.$javaVersionMinor.$javaVersionPatch is too old!"
  100. exit 1;
  101. fi
  102. fi
  103. fi
  104.  
  105. echo ''
  106. echo 'Found Java version is sufficient. Starting right now.'
  107. ##########################################################################
  108. exec -a $appName $JAVA $JAVA_OPTS -jar $0
  109. #echo exec -a $appName $JAVA $JAVA_OPTS -jar $0

Der Code dürfte eigentlich selbsterklärend sein.
Es sucht eine Java-Umgebung und prüft ob eine gewisse Java-Version unterstützt wird. Zusätzlich wird die Umgebungsvariable $JAVA_OPTS unterstützt. Ist diese gesetzt, so wird sie genutzt. Andernfalls kann man Standardparameter angeben.
Außerdem bekommt der Prozess einen eigenen Namen, damit man nicht mit PIDs ‚rumhantieren muss.
Die Meldungen werden zusätzlich auch versucht an den X-Server durchzureichen, damit man bei Problemen auch etwas davon mitbekommt.

Interessant ist nun, wie man mit diesem Script und einer JAR-Datei eiwwnen Wrapper baut.

Wir üblich ist es unter Linux mal wieder wesentlich einfacher als man denkt:
cat script.sh myapp.jar > myapp.bin
chmod +x myapp.bin

Und fertig ist die Geschichte (Unter der Voraussetzung, dass das Script oben als script.sh und die Java-Application als myapp.jar vorliegt).

Die Anwendung lässt sich dann wie jede BIN/SH-Datei in Linux starten.

Schreibe einen Kommentar