Pular para o conteúdo

Instalador Windows para um app Java, do jpackage ao Setup.exe

Use o jpackage para empacotar seu JAR com um runtime Java em uma pasta com um .exe nativo e transforme essa pasta em um instalador Windows, sem precisar do WiX toolset.

Atualizado em 31 de outubro de 2026 · 3 min de leitura

"Instale o Java primeiro" não é algo que você quer dizer aos seus clientes. Desde o JDK 14, o jpackage resolve metade do problema: ele empacota sua aplicação com um runtime Java enxuto e entrega um MyApp.exe nativo. A outra metade, o instalador Windows, é onde o jpackage pede que você instale o WiX toolset e aprenda suas particularidades. Este guia pega a pasta que o jpackage produz e a transforma em um Setup.exe sem nada disso.

Passo 1: gerar a imagem da aplicação

Coloque o JAR executável e os JARs de dependência em uma única pasta (lib/ abaixo) e execute o jpackage no Windows:

jpackage --type app-image --name MyApp --input lib --main-jar myapp.jar --main-class com.example.Main --icon app.ico --app-version 2.4.0

Isso cria MyApp/, contendo:

  • MyApp.exe, um lançador nativo com o seu ícone;
  • app/, seus JARs e um arquivo de configuração;
  • runtime/, um runtime Java apenas com os módulos de que o app precisa.

Para um app JavaFX, adicione --module-path apontando para a pasta lib do SDK do JavaFX e --add-modules javafx.controls,javafx.fxml (ajuste para os módulos que você usa). Para um app modular, use --module em vez de --main-jar.

Abra MyApp\MyApp.exe para confirmar que o app inicia sem um Java instalado no sistema. A pasta runtime/ é o que torna isso possível.

O jpackage precisa rodar no Windows para produzir uma imagem Windows. Uma máquina Windows, uma máquina virtual ou um runner Windows no CI funcionam; veja como gerar no Mac para conhecer as opções.

Passo 2: compactar a imagem em zip

Compacte o conteúdo de MyApp/: MyApp.exe, app/ e runtime/. Mantenha a estrutura; o lançador espera encontrar app/ e runtime/ ao lado dele.

Passo 3: gerar o instalador

  1. Envie o zip para o ExeTup. Ele escolhe MyApp.exe como programa principal.
  2. Informe o nome, a mesma versão que você passou em --app-version e o nome do seu publicador.
  3. Escolha todos os usuários (Program Files, prompt de administrador) ou usuário atual (sem prompt). Apps Java corporativos distribuídos a funcionários costumam ser instalados por usuário; apps para consumidores, geralmente por máquina.
  4. Mantenha 64 bits; o jpackage compila para a arquitetura do JDK, que é x64 em quase todas as máquinas.
  5. Envie o app.ico, ative os atalhos e gere o instalador.

O resultado é um instalador Windows que coloca a imagem da aplicação no lugar, com uma entrada no menu Iniciar e um desinstalador. Os clientes nunca veem o Java.

Por que não deixar o jpackage criar o instalador?

jpackage --type exe ou --type msi de fato produz um instalador, e para algumas equipes isso basta. Ele exige o WiX Toolset 3 instalado e no PATH, oferece um assistente fixo com poucas opções, e o comportamento do desinstalador e dos atalhos tem arestas difíceis de ajustar sem mergulhar no WiX. Usar a app-image com um instalador separado mantém as duas responsabilidades apartadas: o jpackage faz o empacotamento do runtime, que é o que ele faz bem, e o instalador cuida da integração com o Windows.

Observações específicas de Java

  • Tamanho do runtime. Um runtime enxuto tem de 40 a 80 MB. O corte de módulos no estilo do jlink acontece automaticamente; --jlink-options --strip-debug e --jlink-options --no-man-pages reduzem um pouco mais.
  • Opções do Java. Passe flags da JVM com --java-options "-Xmx1g" ao gerar a imagem; elas ficam gravadas na configuração do lançador.
  • Atualizações. Distribua um novo instalador com uma versão maior. Instalar por cima da versão anterior substitui app/ e runtime/ no mesmo lugar.
  • Launch4j e similares embrulham um JAR em um .exe, mas não incluem um runtime por padrão, então não eliminam a etapa de "instalar o Java". O jpackage elimina.
  • Assinatura. Assine o MyApp.exe antes de compactar e o Setup.exe baixado depois; veja o guia sobre o SmartScreen.

Perguntas frequentes

Os clientes precisam ter o Java instalado?

Não. A pasta runtime/ criada pelo jpackage contém tudo de que o app precisa, e o instalador a distribui junto com o app.

Posso instalar o app sem o WiX toolset?

Sim. O WiX só é necessário para os tipos exe e msi do próprio jpackage. Gere uma app-image em vez disso e use o ExeTup para o instalador.

Isso funciona com JavaFX?

Sim. Inclua os módulos do JavaFX ao gerar a imagem, teste o MyApp.exe e depois empacote a pasta como descrito acima.

Posso incluir um JDK diferente, como o Temurin?

O jpackage usa para o runtime o JDK a partir do qual ele é executado. Execute-o a partir do JDK que você quer distribuir, ou passe --runtime-image com um runtime que você gerou com o jlink.

Guias relacionados