Proteção de aplicações Java comuns

javaapp é usado para aplicações Java comuns que possuem uma classe principal. Ele gera um arquivo compactado protegido, o VLX JRE da plataforma de destino e um script de inicialização.

1. Operações GUI

  1. Selecione Java Application na página de tipo de aplicação.

    Selecione a Aplicação Java

  2. Escolha o JAR de entrada, Versão Java incluída no pacote e a plataforma de destino, e selecione o modo simples ou o modo avançado.

    Selecione a entrada, a versão do Java, a plataforma de destino e o modo

  3. No modo avançado, preencha Main class conforme necessário e configure parâmetros da JVM, JavaFX e regras de exclusão; esse passo pode ser pulado no modo simples. As descrições de cada opção estão em Configurações do modo avançado do Protector4J.

    Configurar parâmetros avançados para aplicações Java comuns

  4. Selecione o diretório de saída, revise o resumo dos parâmetros e, em seguida, clique em Run protection.

    Selecione o diretório de saída e execute a proteção para a aplicação protegida, garantindo que o escopo de proteção cubra todos os componentes necessários e realizando uma verificação de compatibilidade antes do processo.

2. Exemplo CLI

Quando o Manifest já contém o correto Main-Class:

p4j javaapp app.jar dist

Quando o Manifest não possui Main-Class ou é necessário usar outro classe de inicialização, especifique por meio de --main:

p4j javaapp app.jar dist --main com.example.Main

Especifique simultaneamente a classe de inicialização e os parâmetros do JVM:

p4j javaapp app.jar dist \
  --main com.example.Main \
  --jvm-option -Xms512m \
  --jvm-option -Xmx2g

Proteção seletiva:

p4j javaapp app.jar dist \
  --protect 'com.example.core.**' \
  --exclude 'com.example.core.dto.**'

Varredura de compatibilidade e sugestões automáticas de aplicação:

p4j javaapp app.jar --compat-scan
p4j javaapp app.jar dist --compat-apply

Essas duas opções não podem ser usadas ao mesmo tempo; a diferença entre elas é:

OpçãoComportamentoQuando usar
--compat-scanApenas escaneia o JAR de entrada, exibe riscos e sugestões de configuração e depois encerra; não codifica nem gera o dist, portanto não é necessário um diretório de saídaUse-o primeiro para visualizar relatórios após proteger uma aplicação pela primeira vez, atualizar dependências ou ajustar o escopo de proteção, bem como para resolver problemas de compatibilidade
--compat-applyApós o escaneamento, combina automaticamente as sugestões conservadoras e continua com a codificação e geração da saída, portanto é necessário especificar um diretório de saídaUse-o para concluir a compactação após ler os resultados do escaneamento e aceitar as sugestões automáticas; também pode ser usado em construções repetidas com regras já verificadas ou em fluxos CI

Para o javaapp e --compat-apply, é possível adicionar classes de exclusão com base nos resultados do escaneamento e ajustar opções como ZIP overlay, JavaFX e sufixos de arquivamento. Para as últimas três opções, os valores especificados explicitamente na linha de comando têm prioridade; as classes de exclusão sugeridas são automaticamente combinadas com o --exclude por padrão. Se não desejar adicionar classes de exclusão automaticamente, é possível passar o --no-compat-excludes simultaneamente. O scanner realiza apenas análise heurística estática; problemas que exigem modificação no código não serão corrigidos automaticamente pelo --compat-apply, e testes de regressão ainda são necessários na plataforma-alvo após a geração

Para outras comandos CLI, todas as opções, variáveis de ambiente e exemplos de automação, consulte o Referência de parâmetros CLI.

3. Estrutura de saída

dist/
├── app.p4jx              # ou --archive-suffix jar para gerar app.jar
├── vlxjre/               # tempo de execução compatível com a plataforma de arquivamento e de destino
├── lib/                  # dependências de Manifest Class-Path, opcionais
├── run.sh
├── run.command
├── run.bat
└── README.md

Recursos que não são de classe são armazenados na visualização de recursos públicos do P4JX. Recursos de classe protegidos exibem apenas metadados para o scanner; o corpo real dos métodos só pode ser carregado pelo tempo de execução do VLX.

4. Iniciar

./run.sh [parâmetros do aplicativo...]

Windows:

run.bat [parâmetros do aplicativo...]

Não substitua o vlxjre no diretório de saída pelo JRE do sistema. Se for necessário iniciá-lo manualmente, mantenha seu classpath, parâmetros da VM e parâmetros de módulo JavaFX usando o script gerado como modelo.

Parâmetros de inicialização da JVM

Durante a compilação, é possível preencher um parâmetro por linha no JVM startup options da GUI ou reutilizá-los na CLI:

--jvm-option -Xms512m --jvm-option -Xmx2g

Alterar permanentemente o diretório atual após a implantação:

  • macOS/Linux: edite o run.sh e adicione o JVM_OPTS+=("-Xms512m" "-Xmx2g") antes da verificação em APP_JAVA_OPTS; o run.command chamará o mesmo run.sh.
  • Windows: edite o run.bat e adicione o set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g" antes da verificação em APP_JAVA_OPTS.

Parâmetros temporários podem ser injetados por meio de APP_JAVA_OPTS. Exemplos completos e observações estão disponíveis em Configuração de parâmetros de inicialização do JVM. Modificações feitas em scripts manuais serão substituídas durante a reempacotagem.

5. Recomendações para o escopo de proteção

Classe de aplicação com proteção padrão. Em projetos de produção, é recomendado definir explicitamente os pacotes de negócios próprios:

--protect 'com.mycompany.product.**'

Geralmente, os seguintes itens devem ser excluídos:

  • DTOs e records de serialização/deserialização direta do Jackson;
  • Clases cujos campos ou métodos são acessados por JNI;
  • Clases que exigem reescrita em frameworks ORM, de injeção de dependências ou de proxy;
  • Bibliotecas de terceiros e frameworks de código aberto;
  • Classe que deve ser redefinida a partir de um array de bytes por meio de um ClassLoader personalizado.

6. Sufixos .p4jx e .jar

p4j javaapp app.jar dist --archive-suffix jar

Essa opção apenas altera o nome do arquivo; o conteúdo do arquivamento continua sendo P4JX. Deve ser utilizada somente quando componentes de terceiros codificam explicitamente .jar no URL ou no nome do arquivo; ela não transforma o arquivamento em um ZIP/JAR comum.