Criando Um JAR Executável

Fez aquele programinha maroto pra faculdade e pra finalizar quer que ele seja aberto só clicando, sem ser preciso abrir um terminal e digitar "javaw Classe", mas nunca conseguiu fazer o jar executável? Continue lendo e você verá como é fácil.

Nesse artigo não explicarei tudo sobre jar, então se você quiser aprender mais sobre JAR use o Java Tutorialsesse tutorial é só pra quem quer criar um executável básico.

Vou partir do ponto que a máquina na qual vai rodar o jar, já tem o java instalado e configurado corretamente e que sua máquina também esteja configurada corretamente. Path, JAVA_HOME.

Levarei em conta também que você tem noções básicas de java.

Vou criar aqui uma pequena classe teste chamada Executavel, que exibe uma mensagem e encerra.

import javax.swing.JOptionPane;
import java.io.Console;
import java.io.IOException;

class Executavel{
	public static void main(String arg[])throws IOException{
		Console con;
		if( (con = System.console()) == null){
			JOptionPane.showMessageDialog(null,"Teste");
			Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL java Executavel");//windows
		}else{
			con.format("Para ver isso eh preciso ter um console.\nConsole.format() Eh praticamente a mesma coisa que System.out.print().%n");
			System.console().format("A diferenca eh que o format precisa de um console, precisa de uma instancia de console, enquanto System.out.print eh estatico e pode ser invocado diretamente.%n");
			System.out.println("Press enter to continue...");
			con.readLine();
			System.exit(0);
		}
	}
}

Para criar o jar usamos um comando chamado "jar", no console digite "jar" e dê enter, você verá como se deve usar o comando e quais são os argumentos disponíveis, vamos usar os seguintes:

-c Cria um novo arquivo compactado.
-f Especifica o nome do jar
-m Especifica as informações do manifesto a partir de um arquivo de texto
-u atualiza jar existente

Para que nosso jar seja executável é preciso configurar o manifesto, e o que é manifesto? O manifesto contém as informações do jar, simples assim. Um manifesto bem simples chamado manifesto, salvo como texto.

Manifest-Version: 1.0
Created-By: Autor
Main-Class: Executavel

Explicação:
   1ª linha: Versão do jar.
   2ª linha: Quem criou
   3ª linha: Classe que contém o método "main(String)", sem o .class. Se você configurou sua vm pra rodar main com outra assinatura, você é um...

Vale ressaltar um pequeno detalhe, a última linha deve ser sempre uma linha em branca, caso contrário não vai funcionar.

Vamos criar o jar, meus arquivos estão todas na mesma pasta, sintaxe:

jar cfm NomeDoJar.jar manifesto.txt Classe.class

Observe a sequencia dos argumentos, se fosse cmf a o resto deveria seguir a ordem: manifesto.txt NomeDoJar.jar Classe.class. O parâmetro "c" só indica que um jar será criado, mf indica que o primeiro parâmetro será o manifesto e o segundo o nome do jar. Não acho que seja preciso falar mas... Você pode adicionar quantas classes forem necessárias no final do comando. *.class para todas as classes da pasta...

Pronto executável criado, para atualizar utilize uf, sintaxe:
   jar uf NomeDoJar.jar Classe.class

Se você atualizar uma classe de nome existente dentro do jar, ela será sobrescrita.

Um pouco mais sobre Console e Runtime.

Não sei o que é "rundll32 SHELL32.DLL,ShellExec_RunDLL", sei que sem isso não funciona.