Proteger aplicativos JavaFX

O JavaFX pode ser ativado tanto em aplicativos Java comuns quanto em aplicativos de desktop Spring Boot. O tempo de execução enxuto do P4JX não inclui JavaFX por padrão: é preciso ativá-lo explicitamente ou deixar que a verificação de compatibilidade o faça.

1. Pela interface gráfica

  1. Para um aplicativo JavaFX simples, escolha Aplicação Java na página do tipo de aplicativo. Para um aplicativo de desktop JavaFX construído sobre um contêiner Spring, escolha Spring Boot. A criptografia de bibliotecas produz apenas um arquivo protegido e não substitui o empacotamento de um aplicativo JavaFX de verdade.

    Escolher Aplicação Java ou Spring Boot

  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. Os componentes do JavaFX são obtidos separadamente para cada versão do Java e cada plataforma, de modo que uma tarefa com várias plataformas gera um pacote de saída independente para cada uma.

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

  3. No modo simples, se a verificação de compatibilidade encontrar referências a javafx.* ou dependências do JavaFX, ela ativa o JavaFX automaticamente e explica o motivo no resultado. Se também encontrar javafx.scene.web, o WebView é incluído. Como a verificação é uma análise heurística estática, confira de novo o resumo do JavaFX na página de saída.

  4. No modo avançado, marque Incluir o JavaFX no runtime empacotado na aba Tempo de execução do JavaFX e escolha a estratégia para o WebView:

    • Auto (detectar javafx.scene.web): decide conforme o aplicativo referencie ou não javafx.scene.web.
    • Incluir: sempre inclui o WebView (fx-webkit).
    • Excluir: nunca o inclui.

    Num aplicativo Java comum, a aba aparece assim:

    Aba do tempo de execução do JavaFX nas opções avançadas de um aplicativo Java comum

    Os aplicativos de desktop Spring Boot usam uma aba de mesmo nome:

    Aba do tempo de execução do JavaFX nas opções avançadas do Spring Boot

  5. Depois de escolher a pasta de saída, confirme que o resumo indica JavaFX como incluído e que o estado do WebView corresponde ao esperado, e clique em Executar proteção. Com o pacote pronto, use o script de inicialização dele para verificar em cada plataforma-alvo a janela, o FXML, os recursos CSS e de imagem, e o WebView.

Os componentes do WebView ocupam cerca de 40 MB. Escolha Excluir para deixar o pacote menor se não precisar deles. Os demais ajustes das páginas avançadas estão descritos em Configurações do modo avançado do Protector4J.

2. Obter os componentes pela linha de comando

p4j javaapp fx-app.jar dist --javafx

Para Spring Boot com JavaFX:

p4j springboot fx-boot.jar dist --javafx

Para forçar a inclusão ou a exclusão do WebView:

--javafx-webview
--no-javafx-webview

A ferramenta baixa os componentes adequados do site público de download da sua região, conforme a linha do JDK e a plataforma-alvo. Nem o download do JavaFX nem o do VLX JRE exige entregar uma chave de armazenamento em nuvem ao cliente.

3. Componentes off-line

A linha de comando aceita um diretório local:

p4j javaapp fx-app.jar dist --javafx /opt/p4jx-fx

O diretório pode ter uma destas duas formas:

  • fx-core.tar.gz e, opcionalmente, fx-webkit.tar.gz;
  • uma árvore de arquivos do JavaFX já extraída, com lib/ na raiz.

A interface gráfica não permite escolher um diretório local do JavaFX; use a linha de comando quando estiver off-line.

4. FXML

Se o aplicativo usa FXMLLoader, a verificação de compatibilidade recomenda ativar a camada ZIP para scanners:

p4j javaapp fx-app.jar dist --javafx --zip-overlay scanner

Os recursos FXML, as assinaturas dos controladores e a varredura do framework precisam ser conferidos iniciando o aplicativo de fato na plataforma-alvo.

5. Java 8 em comparação com Java 11 e posteriores

  • O Java 8 usa jfxrt.jar e o modelo de diretórios de extensão, então os scripts gerados costumam dispensar opções de módulo.
  • O Java 11 e posteriores usam JAR modulares do JavaFX, e os scripts gerados definem um caminho de módulos próprio junto com --add-modules.

Inicie sempre pelo run.sh, run.command ou run.bat gerado. Não aponte você mesmo o caminho de módulos para todo o vlxjre/lib.

6. Como funciona a detecção automática

A detecção examina as referências de classe do seu próprio código e os nomes de arquivo dos JAR de dependência. Ela deliberadamente não vasculha o bytecode de todas as dependências de terceiros: isso faria integrações opcionais do JavaFX parecerem realmente em uso.

Se o JavaFX estiver embutido por shading numa dependência cujo nome não denuncia isso, a detecção automática pode deixá-lo passar. Nesse caso, informe --javafx explicitamente.

7. Alcance de proteção recomendado

  • Proteger ou não as subclasses de Application do JavaFX, os controladores FXML e os modelos de propriedades depende de como se comportam nos testes com a sua versão-alvo do Java.
  • As classes-ponte acessadas diretamente por JNI ou por código nativo devem ficar sem proteção.
  • Comece pelo modo simples ou por --compat-scan e depois faça testes de regressão sobre a criação de janelas, o carregamento de FXML, os recursos CSS e de imagem, o WebView e as bibliotecas nativas da plataforma.