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 -jar
parâ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.MF
arquivo ao pacote jar. O manifesto deve conter uma entrada Main-Class
que 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 -jar
opçã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.run
no 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 .exe
arquivo binário nativo do Windows , produzindo um resultado semelhante ao explicado neste tutorial. Veja por exemplo http://launch4j.sourceforge.net/