Protéger les applications Java ordinaires

javaapp traite les applications Java ordinaires dotées d'une classe principale. Il produit l'archive protégée, le VLX JRE de chaque plate-forme cible et les scripts de démarrage.

1. Dans l'interface graphique

  1. Sur la page du type d'application, choisissez Application Java.

    Choisir Application Java

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

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

  3. En mode avancé, renseignez la Classe principale si nécessaire et réglez les options JVM, les paramètres JavaFX et les règles d'exclusion. Le mode simple saute cette page. Le sens de chaque option figure dans Réglages du mode avancé de Protector4J.

    Configurer les options avancées d'une application Java ordinaire

  4. Choisissez le répertoire de sortie, vérifiez le récapitulatif et cliquez sur Exécuter la protection.

    Choisir le répertoire de sortie et lancer la protection

2. Exemples en ligne de commande

Lorsque le manifeste déclare déjà la bonne Main-Class :

p4j javaapp app.jar dist

Si le manifeste n'a pas de Main-Class, ou si vous voulez démarrer depuis une autre classe, indiquez-la avec --main :

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

Classe principale et options JVM à la fois :

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

Ne protéger qu'une partie de l'application :

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

Analyse de compatibilité et application automatique des recommandations :

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

Les deux options ne peuvent pas être employées ensemble. Voici ce qui les distingue :

OptionEffetQuand l'utiliser
--compat-scanAnalyse le JAR d'entrée, affiche les risques et les recommandations de configuration, puis s'arrête. Rien n'est encodé et aucun dist n'est produit : aucun répertoire de sortie n'est requis.Lisez d'abord le rapport lors de la première protection, après une mise à jour de dépendances ou un changement d'étendue, et lors de la recherche d'un problème de compatibilité.
--compat-applyAnalyse, intègre les recommandations prudentes, puis poursuit l'encodage et écrit la sortie. Un répertoire de sortie est donc nécessaire.Pour terminer l'empaquetage une fois le résultat de l'analyse lu et les recommandations acceptées. Convient aussi aux constructions répétées et aux chaînes d'intégration continue dont les règles sont déjà validées.

Pour javaapp, --compat-apply peut ajouter des règles d'exclusion à partir de l'analyse et ajuster la superposition ZIP, JavaFX et le suffixe d'archive. Pour ces trois derniers, une valeur donnée explicitement en ligne de commande l'emporte. Les exclusions recommandées sont fusionnées par défaut avec vos propres motifs --exclude ; ajoutez --no-compat-excludes si vous ne le souhaitez pas. Le scanner ne fait qu'une analyse heuristique statique : les problèmes qui exigent une modification du code ne sont pas corrigés par --compat-apply, et l'application empaquetée nécessite toujours des tests de non-régression sur la plate-forme cible.

Les autres commandes, la liste complète des options, les variables d'environnement et les exemples d'automatisation figurent dans la Référence de la ligne de commande.

3. Structure de la sortie

dist/
├── app.p4jx              # devient app.jar avec --archive-suffix jar
├── vlxjre/               # runtime correspondant à l'archive et à la plate-forme
├── lib/                  # dépendances du Class-Path du manifeste, facultatif
├── run.sh
├── run.command
├── run.bat
└── README.md

Les ressources autres que les classes sont conservées dans la vue publique des ressources de l'archive P4JX. Les classes protégées n'exposent aux scanners qu'une ébauche de métadonnées ; seul le runtime VLX peut charger le corps réel des méthodes.

4. Démarrage

./run.sh [arguments de l'application...]

Sous Windows :

run.bat [arguments de l'application...]

Ne remplacez pas le répertoire vlxjre de la sortie par un JRE du système. Si vous devez démarrer l'application à la main, prenez le script produit comme modèle et conservez son classpath, ses options de VM et ses options de module JavaFX.

Pour les cibles Windows, vous pouvez aussi produire un lanceur natif qui s'exécute d'un double-clic. Il coexiste avec les scripts de démarrage — voir Créer un lanceur EXE Windows.

Options de démarrage JVM

À l'empaquetage, saisissez une option par ligne dans Options de démarrage JVM dans l'interface graphique, ou répétez le commutateur en ligne de commande :

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

Pour les modifier durablement dans un répertoire déjà déployé :

  • macOS et Linux : modifiez run.sh et ajoutez JVM_OPTS+=("-Xms512m" "-Xmx2g") avant le test sur APP_JAVA_OPTS. run.command appelle le même run.sh.
  • Windows : modifiez run.bat et ajoutez set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g" avant le test sur APP_JAVA_OPTS.

Les options ponctuelles peuvent être injectées via APP_JAVA_OPTS. Les exemples complets et les mises en garde figurent dans Options de démarrage JVM. Les modifications manuelles des scripts sont écrasées au prochain empaquetage.

5. Étendue de protection recommandée

Par défaut, les classes propres à l'application sont protégées. Pour un projet en production, mieux vaut désigner explicitement vos paquets métier :

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

Classes qu'il convient normalement d'exclure :

  • DTO et records que Jackson sérialise ou désérialise directement ;
  • classes dont les champs ou les méthodes sont atteints par JNI ;
  • classes qu'un ORM, un conteneur d'injection de dépendances ou un framework de proxys doit réécrire ;
  • bibliothèques tierces et frameworks open source ;
  • classes qu'un ClassLoader maison doit redéfinir à partir d'un tableau d'octets.

6. Les suffixes .p4jx et .jar

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

Cette option ne change que le nom du fichier ; le contenu de l'archive reste du P4JX. Ne l'employez que lorsqu'un composant tiers code en dur .jar dans une URL ou un nom de fichier. Elle ne transforme pas l'archive en ZIP ou en JAR ordinaire.