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
| Projeto | Suporte |
|---|---|
| Tipo de aplicação | Java Application, Spring Boot (todos os três layouts) e Tomcat |
| Plataforma alvo | windows-x64, windows-x86, windows-aarch64 |
| Não é suportado | Library 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
- 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.
- 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.
- 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.
- 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.
- 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ções | Descrição |
|---|---|
--windows-exe | Habilitar 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.
| Comportamento | Descrição |
|---|---|
| Tempo de execução | Utiliza fixamente vlxjre\bin\java.exe contido no pacote, sem usar o Java do sistema e sem ler JAVA_HOME |
| Parâmetros da linha de comando | Os parâmetros passados para o EXE são adicionados intactos após os parâmetros da aplicação |
| Modo de console | Herda 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 GUI | Não cria janela de console, adequado para aplicações de desktop |
| Variáveis de ambiente | Limpe 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.
- Conclua a compactação e confirme que o EXE consegue iniciar o aplicativo normalmente.
- Faça a assinatura Authenticode com seu próprio certificado e adicione um carimbo de data e hora RFC3161.
- Verifique a assinatura usando a política
/pado 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
| Sintomas | Causas e soluções |
|---|---|
| É necessário uma plataforma alvo do Windows | O 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.