Launch4j works on both Windows and Linux/Mac. But if you’re running Linux/Mac, there is a way to embed your jar into a shell script that performs the autolaunch for you, so you have only one runnable file:
exestub.sh:
#!/bin/sh MYSELF=`which "$0" 2>/dev/null` [ $? -gt 0 -a -f "$0" ] && MYSELF="./$0" JAVA_OPT="" PROG_OPT="" # Parse options to determine which ones are for Java and which ones are for the Program while [ $# -gt 0 ] ; do case $1 in -Xm*) JAVA_OPT="$JAVA_OPT $1" ;; -D*) JAVA_OPT="$JAVA_OPT $1" ;; *) PROG_OPT="$PROG_OPT $1" ;; esac shift done exec java $JAVA_OPT -jar $MYSELF $PROG_OPT
Then you create your runnable file from your jar:
$ cat exestub.sh myrunnablejar.jar > myrunnable $ chmod +x myrunnable
It works the same way launch4j works: because a jar has a zip format, which header is located at the end of the file. You can have any header you want (either binary executable or, like here, shell script) and run java -jar <myexe>
, as <myexe>
is a valid zip/jar file.