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:
- #!/bin/sh
- ##################################################################
- #Set application name
- appName=beamer-tool_admin
- # Define minimum java version
- minJavaVersionMajor=1
- minJavaVersionMinor=5
- minJavaVersionPatch=2
- # env var $JAVA_OPTS is set with default values if not set
- defaultJAVA_OPTS='-Xms32M -Xmx384M -Djava.net.preferIPv4Stack=true'
- ##################################################################
- ##################################################################
- showmessage() {
- #Use KDE dialog
- if [ $DE = "kde" ]; then
- kdialog -title "$0" --error "$1"
- #Use Gnomes dialog
- elif [ $DE -eq "gnome" ]; then
- zenity --title "$0" --error --text="$1"
- #Fallback for other DE
- else
- xmessage -center "$1"
- fi
- }
- ###################################################################
- #Detect DE for future message showings
- if [ $KDE_FULL_SESSION = "true" ]; then
- DE=kde;
- elif [ $GNOME_DESKTOP_SESSION_ID != "" ]; then
- DE=gnome;
- else
- DE=x;
- fi
- ###################################################################
- #Detect Java and Java Opts
- JAVA=java
- if [ -n "$JAVA_HOME" ]; then
- JAVA="$JAVA_HOME/bin/java"
- fi
- # check JAVA_OPTS and set with defaults if not set
- if [ -z "$JAVA_OPTS" ]; then
- JAVA_OPTS=$defaultJAVA_OPTS
- fi
- echo '#############################################'
- echo ' Java Discovery:'
- if ( which $JAVA 2>&1 > /dev/null ); then
- echo `which $JAVA`
- else
- echo 'Cannot find Java. Please install or correct your JAVA_HOME'
- showmessage "Cannot find Java.\nPlease install or correct your JAVA_HOME!"
- exit 2
- fi
- echo ''
- #####################################################################
- #Detect Java version and check it
- #create tmp file name
- tmpJavaVersion=mktemp
- # query complete version by java
- java -version 2>&1 | head -n 1 > $tmpJavaVersion
- # clean output
- javaVersion=`awk 'BEGIN {FS = "\""} {print $2}' $tmpJavaVersion`
- # split version parts
- javaVersionMajor=`awk 'BEGIN {FS = "."} {print $1}'` << EOF
- $javaVersion
- EOF
- javaVersionMinor=`awk 'BEGIN {FS = "."} {print $2}'` << EOF
- $javaVersion
- EOF
- javaVersionPatch=`awk 'BEGIN {FS = "."} {print $3}'` << EOF
- $javaVersion
- EOF
- javaVersionPatch=`awk 'BEGIN {FS = "_"} {print $1}'` << EOF
- $javaVersionPatch
- EOF
- ######################################################################
- # Print found java version
- echo '#############################################'
- echo ' Java Version:'
- echo "Found version: $javaVersionMajor.$javaVersionMinor.$javaVersionPatch"
- echo "Required version: $minJavaVersionMajor.$minJavaVersionMinor.$minJavaVersionPatch"
- if [ $javaVersionMajor -gt $minJavaVersionMajor ]; then
- echo -n ''
- else
- if [ $javaVersionMajor -eq $minJavaVersionMajor ] &&
- [ $javaVersionMinor -gt $minJavaVersionMinor ]; then
- echo -n ''
- else
- if [ $javaVersionMajor -eq $minJavaVersionMajor ] &&
- [ $javaVersionMinor -eq $minJavaVersionMinor ] &&
- [ $javaVersionPatch -ge $minJavaVersionPatch ]; then
- echo -n ''
- else
- echo "Please update your Java to the required Java version $minJavaVersionMajor.$minJavaVersionMinor.$minJavaVersionPatch"
- showmessage "Please update your Java to the required Java version $minJavaVersionMajor.$minJavaVersionMinor.$minJavaVersionPatch.\nYour version $javaVersionMajor.$javaVersionMinor.$javaVersionPatch is too old!"
- exit 1;
- fi
- fi
- fi
- echo ''
- echo 'Found Java version is sufficient. Starting right now.'
- ##########################################################################
- exec -a $appName $JAVA $JAVA_OPTS -jar $0
- #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.