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
- Envie o zip para o ExeTup. Ele escolhe
MyApp.execomo programa principal. - Informe o nome, a mesma versão que você passou em
--app-versione o nome do seu publicador. - 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.
- Mantenha 64 bits; o jpackage compila para a arquitetura do JDK, que é x64 em quase todas as máquinas.
- 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
jlinkacontece automaticamente;--jlink-options --strip-debuge--jlink-options --no-man-pagesreduzem 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/eruntime/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.exeantes de compactar e oSetup.exebaixado 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
- Como criar um Setup.exe para seu app Windows (sem código)O que um Setup.exe realmente faz, as três formas de criar um e como transformar a pasta do seu app em um instalador profissional em minutos, sem escrever script de instalação.
- Transformar um .exe em instalador do Windows (exe para Setup.exe)Como converter um .exe simples, ou uma pasta com um .exe dentro, em um instalador do Windows de verdade, com atalhos e desinstalador, sem escrever script de instalação.
- Criar um instalador Windows para um app .NET (WPF, WinForms, console)Publique um app desktop .NET com dotnet publish, escolha entre dependente do framework e autocontido, e transforme a pasta de publicação em um Setup.exe com atalhos e desinstalador.