Protéger les applications JavaFX

JavaFX peut être activé aussi bien pour les applications Java ordinaires que pour les applications de bureau Spring Boot. Le runtime allégé de P4JX n'embarque pas JavaFX par défaut : il faut l'activer explicitement, ou laisser l'analyse de compatibilité s'en charger.

1. Dans l'interface graphique

  1. Pour une application JavaFX simple, choisissez Application Java sur la page du type d'application. Pour une application de bureau JavaFX bâtie sur un conteneur Spring, choisissez Spring Boot. Le chiffrement de la bibliothèque ne produit qu'une archive protégée et ne remplace pas l'empaquetage d'une véritable application JavaFX.

    Choisir Application Java ou Spring Boot

  2. Sélectionnez le JAR d'entrée, la version de Java à embarquer et les plates-formes cibles, puis choisissez le mode simple ou avancé. Les composants JavaFX sont récupérés séparément pour chaque version de Java et chaque plate-forme : une tâche multi-plates-formes produit donc un paquet de sortie distinct pour chacune.

    Choisir l'entrée, la version de Java, la plate-forme cible et le mode

  3. En mode simple, si l'analyse de compatibilité trouve des références javafx.* ou des dépendances JavaFX, elle active JavaFX automatiquement et en explique la raison dans son résultat. Si elle repère aussi javafx.scene.web, WebView est inclus. L'analyse étant heuristique et statique, vérifiez de nouveau le récapitulatif JavaFX sur la page de sortie.

  4. En mode avancé, cochez Inclure JavaFX dans le runtime empaqueté dans l'onglet Runtime JavaFX, puis choisissez la stratégie WebView :

    • Automatique (détecter javafx.scene.web) : décide selon que l'application référence ou non javafx.scene.web.
    • Inclure : intègre toujours WebView (fx-webkit).
    • Exclure : ne l'intègre jamais.

    Pour une application Java ordinaire, l'onglet se présente ainsi :

    Onglet Runtime JavaFX dans les options avancées d'une application Java ordinaire

    Les applications de bureau Spring Boot utilisent un onglet portant le même nom :

    Onglet Runtime JavaFX dans les options avancées de Spring Boot

  5. Après avoir choisi le répertoire de sortie, vérifiez que le récapitulatif indique JavaFX comme intégré et que l'état de WebView correspond à vos attentes, puis cliquez sur Exécuter la protection. Une fois le paquet produit, utilisez son script de démarrage pour contrôler sur chaque plate-forme cible la fenêtre, le FXML, les ressources CSS et images, et WebView.

Les composants WebView pèsent environ 40 Mo. Choisissez Exclure pour alléger le paquet si vous ne vous en servez pas. Les autres réglages des pages avancées sont décrits dans Réglages du mode avancé de Protector4J.

2. Récupérer les composants en ligne de commande

p4j javaapp fx-app.jar dist --javafx

Pour Spring Boot avec JavaFX :

p4j springboot fx-boot.jar dist --javafx

Pour forcer l'inclusion ou l'exclusion de WebView :

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

L'outil télécharge les composants adaptés depuis le site public de téléchargement de votre région, selon la ligne du JDK et la plate-forme cible. Ni le téléchargement de JavaFX ni celui du VLX JRE n'exige de confier une clé de stockage cloud au client.

3. Composants hors ligne

La ligne de commande accepte un répertoire local :

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

Ce répertoire peut prendre l'une de ces deux formes :

  • fx-core.tar.gz et, facultativement, fx-webkit.tar.gz ;
  • une arborescence JavaFX déjà extraite, avec lib/ pour racine.

L'interface graphique ne permet pas de désigner un répertoire JavaFX local : utilisez la ligne de commande hors connexion.

4. FXML

Si l'application utilise FXMLLoader, l'analyse de compatibilité recommande d'activer la superposition ZIP pour scanners :

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

Les ressources FXML, les signatures des contrôleurs et le balayage du framework doivent être vérifiés en démarrant réellement l'application sur la plate-forme cible.

5. Java 8 face à Java 11 et versions ultérieures

  • Java 8 utilise jfxrt.jar et le modèle des répertoires d'extension : les scripts produits n'ont généralement pas besoin d'options de module.
  • Java 11 et les versions ultérieures utilisent des JAR JavaFX modulaires, et les scripts produits définissent un chemin de modules dédié ainsi que --add-modules.

Démarrez toujours par le run.sh, run.command ou run.bat produit. Ne pointez pas vous-même le chemin de modules vers l'ensemble de vlxjre/lib.

6. Comment fonctionne la détection automatique

La détection examine les références de classes de votre propre code et les noms de fichiers des JAR de dépendances. Elle n'inspecte volontairement pas le bytecode de toutes les dépendances tierces : cela ferait passer pour utilisées des intégrations JavaFX seulement optionnelles.

Si JavaFX est intégré par shading dans une dépendance dont le nom ne le laisse pas deviner, la détection automatique peut le manquer. Indiquez alors explicitement --javafx.

7. Étendue de protection recommandée

  • Protéger ou non les sous-classes Application de JavaFX, les contrôleurs FXML et les modèles de propriétés dépend de leur comportement lors des tests avec votre version de Java cible.
  • Les classes passerelles atteintes directement par JNI ou par du code natif doivent rester sans protection.
  • Commencez par le mode simple ou --compat-scan, puis menez des tests de non-régression sur la création de fenêtres, le chargement du FXML, les ressources CSS et images, WebView et les bibliothèques natives de la plate-forme.