Proteger aplicativos Java comuns
javaapp trata os aplicativos Java comuns que têm uma classe principal. Ele gera o arquivo protegido, o VLX JRE de cada plataforma-alvo e os scripts de inicialização.
1. Pela interface gráfica
-
Na página do tipo de aplicativo, escolha Aplicação Java.

-
Selecione o JAR de entrada, a versão do Java a incluir e as plataformas-alvo, e escolha entre modo simples ou avançado.

-
No modo avançado, preencha a Classe principal se necessário e configure as opções da JVM, os ajustes do JavaFX e as regras de exclusão. O modo simples pula esta página. O significado de cada opção está em Configurações do modo avançado do Protector4J.

-
Escolha a pasta de saída, confira o resumo e clique em Executar proteção.

2. Exemplos de linha de comando
Quando o manifesto já declara a Main-Class correta:
p4j javaapp app.jar dist
Se o manifesto não tiver Main-Class, ou se você quiser iniciar por outra classe, indique-a com --main:
p4j javaapp app.jar dist --main com.example.Main
Classe principal e opções da JVM ao mesmo tempo:
p4j javaapp app.jar dist \
--main com.example.Main \
--jvm-option -Xms512m \
--jvm-option -Xmx2g
Proteger apenas parte do aplicativo:
p4j javaapp app.jar dist \
--protect 'com.example.core.**' \
--exclude 'com.example.core.dto.**'
Verificação de compatibilidade e aplicação automática das recomendações:
p4j javaapp app.jar --compat-scan
p4j javaapp app.jar dist --compat-apply
As duas opções não podem ser usadas juntas. A diferença é esta:
| Opção | O que faz | Quando usar |
|---|---|---|
--compat-scan | Examina o JAR de entrada, mostra os riscos e as recomendações de configuração e encerra. Nada é codificado e nenhum dist é gerado, então não é preciso pasta de saída. | Leia o relatório primeiro na primeira proteção, depois de atualizar dependências ou mudar o alcance, e ao investigar um problema de compatibilidade. |
--compat-apply | Examina, incorpora as recomendações conservadoras e segue com a codificação e a saída, por isso exige uma pasta de saída. | Use para concluir o empacotamento depois de ler o resultado e aceitar as recomendações. Serve também para compilações repetidas e pipelines de CI com regras já validadas. |
Para javaapp, --compat-apply pode acrescentar regras de exclusão a partir da verificação e ajustar a camada ZIP, o JavaFX e o sufixo do arquivo. Nesses três últimos casos, prevalece o valor informado explicitamente na linha de comando. As exclusões recomendadas são combinadas por padrão com os seus próprios padrões --exclude; acrescente --no-compat-excludes se não quiser isso. O scanner faz apenas análise heurística estática, de modo que os problemas que exigem mudanças no código não são resolvidos por --compat-apply, e o aplicativo empacotado continua precisando de testes de regressão na plataforma-alvo.
Os demais comandos, todas as opções, as variáveis de ambiente e os exemplos de automação estão na Referência da linha de comando.
3. Estrutura da saída
dist/
├── app.p4jx # vira app.jar com --archive-suffix jar
├── vlxjre/ # tempo de execução compatível com o arquivo e a plataforma
├── lib/ # dependências do Class-Path do manifesto, opcional
├── run.sh
├── run.command
├── run.bat
└── README.md
Os recursos que não são classes ficam na visão pública de recursos do arquivo P4JX. As classes protegidas mostram aos scanners apenas um esboço de metadados; só o tempo de execução VLX consegue carregar o corpo real dos métodos.
4. Inicialização
./run.sh [argumentos do aplicativo...]
No Windows:
run.bat [argumentos do aplicativo...]
Não substitua a pasta vlxjre da saída por um JRE do sistema. Se precisar iniciar o aplicativo à mão, use o script gerado como modelo e preserve o classpath, as opções de VM e as opções de módulo do JavaFX.
Para alvos Windows também é possível gerar um iniciador nativo que roda com dois cliques. Ele convive com os scripts de inicialização — veja Criar um iniciador EXE do Windows.
Opções de inicialização JVM
Ao empacotar, digite uma opção por linha em Opções de inicialização JVM na interface gráfica, ou repita o parâmetro na linha de comando:
--jvm-option -Xms512m --jvm-option -Xmx2g
Para alterá-las de forma permanente numa pasta já implantada:
- macOS e Linux: edite
run.she acrescenteJVM_OPTS+=("-Xms512m" "-Xmx2g")antes da verificação deAPP_JAVA_OPTS. Orun.commandchama o mesmorun.sh. - Windows: edite
run.bate acrescenteset "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g"antes da verificação deAPP_JAVA_OPTS.
Opções pontuais podem ser injetadas por APP_JAVA_OPTS. Os exemplos completos e as ressalvas estão em Opções de inicialização JVM. Alterações manuais nos scripts são sobrescritas ao empacotar de novo.
5. Alcance de proteção recomendado
Por padrão, as classes do próprio aplicativo são protegidas. Em projetos de produção, é melhor nomear explicitamente os seus pacotes de negócio:
--protect 'com.mycompany.product.**'
Classes que normalmente convém excluir:
- DTOs e records que o Jackson serializa ou desserializa diretamente;
- classes cujos campos ou métodos são acessados por JNI;
- classes que um ORM, um contêiner de injeção de dependências ou um framework de proxies precisa reescrever;
- bibliotecas de terceiros e frameworks de código aberto;
- classes que um ClassLoader próprio precisa redefinir a partir de um vetor de bytes.
6. Os sufixos .p4jx e .jar
p4j javaapp app.jar dist --archive-suffix jar
Esta opção muda apenas o nome do arquivo; o conteúdo continua sendo P4JX. Use-a somente quando um componente de terceiros tiver .jar fixo numa URL ou num nome de arquivo. Ela não transforma o arquivo num ZIP ou JAR comum.