Como fazer um arquivo JAR executável em Linux

Todo programador Java sabe – ou deveria saber – que é possível criar um arquivo de pacote Java executável (JAR), de modo que, para iniciar um aplicativo, é suficiente especificar o nome do arquivo jar na linha de comando do interpretador Java junto com o -jarparâmetro. Por exemplo:

$ java -jar helloworld.jar

Existem muitos tutoriais que mostram como implementar esse recurso usando Ant, Maven, Eclipse, Netbens, etc.

De qualquer forma, em sua forma básica, basta adicionar um MANIFEST.MFarquivo ao pacote jar. O manifesto deve conter uma entrada Main-Classque especifica qual é a classe que define o método principal para seu aplicativo. Por exemplo:

$ javac HelloWorld.java
$ echo
Main-Class: HelloWorld > MANIFEST.MF
$ jar
-cvmf MANIFEST.MF helloworld.jar HelloWorld.class

Mas isso ainda requer que seus usuários invoquem o interpretador Java com a -jaropção. Há muitos motivos pelos quais seria preferível ter seu aplicativo executável simplesmente invocando-o no shell do terminal como qualquer outro comando.

Aí vem o protip!

Essa técnica é baseada na capacidade de anexar uma carga binária genérica a um script de shell do Linux. Leia mais sobre isso aqui: http://www.linuxjournal.com/content/add-binary-payload-your-shell-scripts

Aproveitando essa possibilidade, o truque é simplesmente embutir um arquivo jar executável em um arquivo de script Bash. O script, quando executado, iniciará o interpretador Java, especificando-se como o jar a ser executado. Muito complexo? Muito mais fácil de fazer na prática do que explicar!

Digamos que você tenha um jar executável chamado helloworld.jar

Copie o script Bash abaixo para um arquivo chamado stub.sh

#!/bin/sh
MYSELF
=`which "$0" 2>/dev/null`
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
java
=java
if test -n "$JAVA_HOME"; then
java
="$JAVA_HOME/bin/java"
fi
exec "$java" $java_args -jar $MYSELF "$@"
exit 1

Em seguida, anexe o arquivo jar ao script salvo e conceda a permissão de execução ao arquivo resultante com o seguinte comando:

cat stub.sh helloworld.jar > hello.run && chmod +x helloworld.run 

Isso é tudo!

Agora você pode executar o aplicativo apenas digitando helloworld.runno terminal do shell.

O script é inteligente o suficiente para passar quaisquer parâmetros de linha de comando para o aplicativo Java de forma transparente. Legal! Não é ?!

No caso de você ser um cara do Windows, obviamente isso não funcionará (exceto que você executará uma camada de compatibilidade do Linux como o Cygwin).

De qualquer forma, existem ferramentas capazes de envolver uma aplicação Java em um .exearquivo binário nativo do Windows , produzindo um resultado semelhante ao explicado neste tutorial. Veja por exemplo http://launch4j.sourceforge.net/