Geração de um iniciador EXE para Windows

Durante a compactação, é possível gerar um iniciador nativo para Windows para aplicativos protegidos. Trata-se de um arquivo executável puro Win32 que pode ser executado com um duplo clique, sem que o usuário precise instalar o Java ou ver o run.bat.

O EXE é opcional e não é gerado por padrão. Ao ativá-lo, os arquivos originais run.sh / run.command / run.bat são mantidos no pacote gerado, e as duas formas de inicialização utilizam exatamente os mesmos arquivos de compactação, classpath, classe principal e parâmetros da JVM.

1. Escopo de proteção

ProjetoSuporte
Tipo de aplicaçãoJava Application, Spring Boot (todos os três layouts) e Tomcat
Plataforma alvowindows-x64, windows-x86, windows-aarch64
Não é suportadoLibrary Encryption (um único arquivo .p4jx não possui um diretório de aplicativo executável)

É necessário selecionar pelo menos uma plataforma alvo Windows. Selecionar plataformas Linux ou macOS ao mesmo tempo não causará falha na tarefa: os subpacotes dessas plataformas serão gerados normalmente, mas sem arquivos EXE, utilizando ainda os scripts de inicialização originais. Se nenhuma plataforma alvo for Windows, a tarefa gerará um erro imediatamente.

2. Operações via GUI

  1. Marque Geração de arquivos EXE para aplicativos Windows (x64/x86/ARM64) na página de seleção do arquivo de entrada e da plataforma alvo, e escolha pelo menos uma plataforma alvo Windows.
  2. Esse botão está localizado antes da divisão entre o modo simples e o modo avançado, portanto ambos os modos podem gerar arquivos EXE.
  3. Ao marcá-lo, será exibida uma página adicional Inicializador de Windows EXE para preencher o nome do arquivo, o modo do iniciador, o ícone e as informações da versão do Windows. Se não for marcado, a página de confirmação final é acessada diretamente.
  4. Após ativar o EXE, o campo de entrada Parâmetros de inicialização da JVM aparece apenas nesta página de inicialização, evitando que dois entradas para o mesmo parâmetro existam. Os parâmetros preenchidos são gravados tanto no EXE quanto no script de inicialização.
  5. A página de confirmação final lista as plataformas nas quais o EXE será realmente gerado, bem como os campos do iniciador que foram preenchidos.

3. Exemplo CLI

Forma simplificada, exigindo apenas --windows-exe:

p4j --target-platform windows-x64 javaapp app.jar dist --windows-exe

Escolha do nome do arquivo e do modo da janela:

p4j --target-platform windows-x64 javaapp app.jar dist \
  --windows-exe \
  --exe-name MyApp.exe \
  --exe-mode gui \
  --exe-icon assets/app.ico

Geração de três arquiteturas do Windows de uma só vez, com recursos de versão completos:

p4j --target-platform windows-x64,windows-x86,windows-aarch64 \
  springboot app.jar dist \
  --windows-exe \
  --exe-name MyService \
  --exe-file-version 1.4.2.0 \
  --exe-product-version 1.4.2.0 \
  --exe-company 'Example Inc.' \
  --exe-product 'Example Service' \
  --exe-description 'Example background service' \
  --exe-copyright 'Copyright (C) 2026 Example Inc.'

O pacote Tomcat também é suportado; o EXE gerado inicia o Tomcat embutido em modo de tela cheia:

p4j --target-platform windows-x64 tomcat app.war dist --context /demo --windows-exe

4. Descrição dos parâmetros

OpçõesDescrição
--windows-exeHabilitar geração de EXE
--exe-name <name>Nome do arquivo EXE; se deixado vazio, será usado o nome do arquivo de entrada. Para Tomcat, é utilizado tomcat
--exe-mode <mode>console (padrão) ou gui
--exe-icon <ico>Arquivo de ícone do Windows, no formato .ico, opcional
--exe-file-version <a.b.c.d>Versão do arquivo PE
--exe-product-version <a.b.c.d>Versão do produto PE
--exe-company <text>Nome da empresa
--exe-product <text>Nome do produto
--exe-description <text>Descrição do arquivo, exibida no Gerenciador de Tarefas e nas propriedades do arquivo
--exe-copyright <text>Declaração de direitos autorais

Qualquer opção --exe-* ativa automaticamente a geração do EXE, eliminando a necessidade de se escrever --windows-exe separadamente.

O nome do arquivo deve ser apenas um nome, sem conter /, \ ou partes de diretório; se não houver o sufixo .exe, ele é adicionado automaticamente.

As regras para os dois campos de versão são as mesmas: números de 1 a 4 separados por pontos finais, com cada valor variando de 0 a 65535, como em 1.0.0.1. O Windows armazena cada segmento como um inteiro sem sinal de 16 bits, portanto não aceita formatos com letras ou espaços, como v1.0 e 1.0-beta. Deixá-lo vazio significa 0.0.0.0. Esses campos são verificados antes do início da compactação, evitando falhas durante o processo.

5. Estrutura de saída

Tomando a Java Application como exemplo, o EXE e o script de inicialização ficam lado a lado no diretório raiz do pacote:

dist/
├── MyApp.exe             # O iniciador Windows foi adicionado.
├── app.p4jx
├── vlxjre/
├── lib/
├── run.sh
├── run.command
├── run.bat
└── README.md

Dentro do pacote, o README.md lista o nome do arquivo EXE gerado, acompanhado de uma sugestão de assinatura de código.

6. Comportamento de execução

O diretório onde está o EXE é o diretório raiz da aplicação. O iniciador aceita apenas diretórios de tempo de execução, arquivamento, classpath e diretório de trabalho dentro do diretório raiz; caminhos que apontam para fora do pacote, bem como caminhos substituídos por links simbólicos ou pontos de conexão, são rejeitados, e o processo não é iniciado. Isso significa que é possível mover ou renomear todo o pacote, mas não é possível copiar o EXE separadamente para uso.

ComportamentoDescrição
Tempo de execuçãoUtiliza fixamente vlxjre\bin\java.exe contido no pacote, sem usar o Java do sistema e sem ler JAVA_HOME
Parâmetros da linha de comandoOs parâmetros passados para o EXE são adicionados intactos após os parâmetros da aplicação
Modo de consoleHerda a entrada e saída padrão da console atual, aguarda o término da aplicação e retorna o código de saída dela
Modo GUINão cria janela de console, adequado para aplicações de desktop
Variáveis de ambienteLimpe JAVA_TOOL_OPTIONS, _JAVA_OPTIONS, JDK_JAVA_OPTIONS e CLASSPATH antes da inicialização, a fim de evitar que injeções externas alterem os parâmetros de inicialização.

Os parâmetros JVM do EXE são fixados durante a compactação e assinados juntamente com o bloco de parâmetros, sendo verificados em tempo de execução; não é possível modificá-los após a implantação. APP_JAVA_OPTS é válido apenas para run.bat, que não é lido pelo EXE. Se for necessário alterar os parâmetros JVM do EXE, faça a compactação novamente.

Pelo mesmo motivo, -javaagent, -agentlib, -agentpath, -Xbootclasspath e --patch-module não permitem que sejam escritos parâmetros de inicialização no EXE. Ao inserir esses parâmetros usando --jvm-option, a compactação falhará imediatamente.

7. Assinatura de código

O Protector4J não adiciona assinatura do editor ao EXE gerado, nem acessa nenhuma credencial Authenticode. Todas as modificações no formato PE, como ícones, recursos de versão e parâmetros de inicialização, são feitas durante a fase de compactação; portanto, a etapa de assinatura deve ser realizada por último.

  1. Conclua a compactação e confirme que o EXE consegue iniciar o aplicativo normalmente.
  2. Faça a assinatura Authenticode com seu próprio certificado e adicione um carimbo de data e hora RFC3161.
  3. Verifique a assinatura usando a política /pa do Windows.

Após a assinatura, não modifique mais este arquivo PE, pois qualquer alteração invalidará a assinatura. Se for necessário trocar o ícone ou o número da versão, reempacote o arquivo e assine-o novamente.

8. Campos do arquivo de tarefa

O p4j-task.yml exportado utiliza a versão 2; ao ativar o formato EXE, os seguintes campos são salvos. Os arquivos de tarefa da versão 1 ainda podem ser lidos normalmente.

windowsExe: true
exeName: MyApp.exe
exeMode: console
exeIcon: assets/app.ico
exeFileVersion: 1.4.2.0
exeProductVersion: 1.4.2.0
exeCompany: Example Inc.
exeProduct: Example Service
exeDescription: Example background service
exeCopyright: Copyright (C) 2026 Example Inc.

9. Perguntas frequentes

SintomasCausas e soluções
É necessário uma plataforma alvo do WindowsO formato EXE está ativado, mas nenhum alvo windows-x64, windows-x86 ou windows-aarch64 foi selecionado
Mensagem indicando que o formato do número da versão está incorreto.O campo da versão contém letras, espaços ou mais de 4 segmentos, ou algum segmento está fora do intervalo de 0 a 65535.
Mensagem indicando que o nome do EXE deve ser apenas o nome do arquivo.O nome do arquivo contém delimitadores de caminho; use um nome que não contenha diretórios.
Mensagem indicando que o arquivo de ícone não foi encontrado.--exe-icon aponta para .ico, que não existe; verifique o caminho.
O programa fecha imediatamente após ser clicado duas vezes, sem exibir nenhuma janela.O aplicativo falha ao ser iniciado no modo GUI; use o modo de console para reempacotar o aplicativo e visualizar as mensagens de erro.
O EXE copiado separadamente não pode ser executado.O iniciador requer que o arquivo em tempo de execução e o arquivo de arquivamento estejam no mesmo diretório do pacote; por favor, copie todo o diretório de saída.

As opções completas da CLI estão disponíveis em Referência de parâmetros CLI, e o fluxo do assistente GUI está disponível em Guia de Uso da GUI.