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

  1. Na página do tipo de aplicativo, escolha Aplicação Java.

    Escolher Aplicação Java

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

    Escolher a entrada, a versão do Java, a plataforma-alvo e o modo

  3. 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.

    Configurar as opções avançadas de um aplicativo Java comum

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

    Escolher a pasta de saída e executar a 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çãoO que fazQuando usar
--compat-scanExamina 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-applyExamina, 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.sh e acrescente JVM_OPTS+=("-Xms512m" "-Xmx2g") antes da verificação de APP_JAVA_OPTS. O run.command chama o mesmo run.sh.
  • Windows: edite run.bat e acrescente set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g" antes da verificação de APP_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.