Créer un lanceur EXE Windows
Lors de l'empaquetage, vous pouvez faire produire un lanceur Windows natif pour l'application protégée. C'est un exécutable Win32 pur qui démarre d'un double-clic : vos utilisateurs n'ont ni Java à installer ni run.bat à connaître.
L'EXE est facultatif et n'est pas construit sans demande explicite. Lorsqu'il est activé, le paquet contient toujours run.sh, run.command et run.bat. Les deux modes de démarrage utilisent exactement la même structure d'archive, le même classpath, la même classe principale et les mêmes options de démarrage JVM.
1. Champ d'application
| Types d'application | Application Java, Spring Boot (les trois dispositions), Tomcat |
| Plates-formes cibles | windows-x64, windows-x86, windows-aarch64 |
| Non pris en charge | Chiffrement de la bibliothèque — une simple archive .p4jx n'est pas un répertoire d'application exécutable |
Vous devez sélectionner au moins une plate-forme cible Windows. Ajouter aussi des cibles Linux et macOS ne pose pas de problème : leurs paquets sont produits normalement, sans EXE, et démarrent par le script habituel. Si aucune cible Windows n'est retenue, la tâche échoue immédiatement.
2. Dans l'interface graphique
- Sur la page du fichier d'entrée et des plates-formes cibles, cochez Générer un EXE d'application Windows (x64/x86/ARM64) et retenez au moins une plate-forme Windows.
- Cette case se trouve avant l'embranchement entre mode simple et mode avancé : les deux modes peuvent donc produire un EXE.
- La cocher ajoute une page Lanceur EXE Windows où vous saisissez le nom du fichier, le mode du lanceur, l'icône et les informations de version Windows. Sans elle, l'assistant passe directement à la page finale.
- Une fois l'EXE activé, le champ Options de démarrage JVM n'apparaît plus que sur cette page du lanceur, afin qu'une même option ne puisse pas être saisie à deux endroits. Ce que vous y indiquez est écrit à la fois dans l'EXE et dans les scripts de démarrage.
- La page finale liste les plates-formes qui recevront réellement un EXE, ainsi que les champs du lanceur que vous avez renseignés.
3. Exemples en ligne de commande
La forme la plus courte ne demande que --windows-exe :
p4j --target-platform windows-x64 javaapp app.jar dist --windows-exe
Fixer le nom du fichier et le mode de fenêtre :
p4j --target-platform windows-x64 javaapp app.jar dist \
--windows-exe \
--exe-name MyApp.exe \
--exe-mode gui \
--exe-icon assets/app.ico
Produire les trois architectures Windows d'un coup, avec des ressources de version complètes :
p4j --target-platform windows-x64,windows-x86,windows-aarch64 \
springboot app.jar dist \
--windows-exe \
--exe-name MyService \
--exe-file-version 1.4.2.0 \
--exe-product-version 1.4.2.0 \
--exe-company 'Example Inc.' \
--exe-product 'Example Service' \
--exe-description 'Example background service' \
--exe-copyright 'Copyright (C) 2026 Example Inc.'
Les paquets Tomcat fonctionnent également ; l'EXE produit démarre le Tomcat intégré au premier plan :
p4j --target-platform windows-x64 tomcat app.war dist --context /demo --windows-exe
4. Options
| Option | Description |
|---|---|
--windows-exe | Produit un EXE d'application Windows |
--exe-name <name> | Nom du fichier EXE ; par défaut celui du fichier d'entrée, ou tomcat pour les paquets Tomcat |
--exe-mode <mode> | console (par défaut) ou gui |
--exe-icon <ico> | Icône Windows facultative, au format .ico |
--exe-file-version <a.b.c.d> | Version de fichier PE : un à quatre nombres, chacun entre 0 et 65535. Vide équivaut à 0.0.0.0 |
--exe-product-version <a.b.c.d> | Version de produit PE, mêmes règles |
--exe-company <text> | Nom de la société |
--exe-product <text> | Nom du produit |
--exe-description <text> | Description du fichier, visible dans le Gestionnaire des tâches et les propriétés |
--exe-copyright <text> | Mention de copyright |
Toute option --exe-* active à elle seule la production de l'EXE : inutile d'ajouter --windows-exe.
Le nom doit être un simple nom de fichier, sans /, \ ni composant de répertoire. Si vous omettez le suffixe .exe, il est ajouté automatiquement.
Les deux champs de version suivent la même règle : un à quatre nombres séparés par des points, chacun entre 0 et 65535, par exemple 1.0.0.1. Windows stocke chaque partie sur un entier non signé de 16 bits : les valeurs comportant des lettres ou des espaces, comme v1.0 ou 1.0-beta, sont donc refusées. Un champ vide vaut 0.0.0.0. Ces deux champs sont validés avant le début de l'empaquetage, si bien qu'une erreur apparaît tout de suite et non en cours de route.
5. Structure de la sortie
Pour une application Java, l'EXE se place à la racine du paquet, aux côtés des scripts de démarrage :
dist/
├── MyApp.exe # le nouveau lanceur Windows
├── app.p4jx
├── vlxjre/
├── lib/
├── run.sh
├── run.command
├── run.bat
└── README.md
Le README.md du paquet énumère les EXE produits et donne des indications sur la signature de code.
6. Comportement du lanceur
Le répertoire contenant l'EXE est la racine de l'application. Le lanceur n'accepte que les chemins de runtime, d'archive, de classpath et de répertoire de travail situés dans cette racine ; tout ce qui se trouve hors du paquet, ainsi que tout ce qui est détourné par un lien symbolique ou une jonction, est refusé et le processus ne démarre pas. Vous pouvez donc déplacer ou renommer le paquet entier, mais pas en extraire l'EXE seul.
| Aspect | Comportement |
|---|---|
| Runtime | Utilise toujours vlxjre\bin\java.exe du paquet. Jamais le Java du système, et JAVA_HOME n'est pas lu. |
| Arguments de ligne de commande | Les arguments passés à l'EXE sont ajoutés après ceux de l'application elle-même. |
| Mode console | Reprend l'entrée et la sortie standard de la console courante, attend la fin de l'application et renvoie son code de sortie. |
| Mode graphique | Ne crée pas de fenêtre de console, ce qui convient aux applications de bureau. |
| Variables d'environnement | Efface avant le démarrage JAVA_TOOL_OPTIONS, _JAVA_OPTIONS, JDK_JAVA_OPTIONS et CLASSPATH, afin que rien d'extérieur au paquet ne puisse injecter d'options. |
Les options JVM de l'EXE sont figées à l'empaquetage, signées avec le bloc de paramètres et vérifiées à l'exécution : elles ne peuvent plus être modifiées après le déploiement. APP_JAVA_OPTS n'agit que sur run.bat ; l'EXE l'ignore. Pour changer les options JVM de l'EXE, refaites l'empaquetage.
Pour la même raison, -javaagent, -agentlib, -agentpath, -Xbootclasspath et --patch-module ne peuvent pas figurer dans les options de démarrage de l'EXE. Les transmettre via --jvm-option fait échouer l'empaquetage sur-le-champ.
7. Signature de code
Protector4J ne signe pas l'EXE produit et n'accède à aucune information d'identification Authenticode. Toutes les modifications du PE — icône, ressources de version et options de démarrage — se font pendant l'empaquetage : la signature doit donc venir en dernier.
- Terminez l'empaquetage et vérifiez que l'EXE démarre correctement l'application.
- Apposez une signature Authenticode avec votre propre certificat, horodatage RFC3161 compris.
- Vérifiez la signature selon la stratégie
/pade Windows.
Ne modifiez plus le fichier PE après signature : tout changement l'invalide. Pour changer l'icône ou le numéro de version, refaites l'empaquetage et la signature.
8. Champs du fichier de tâche
Le p4j-task.yml exporté utilise la version 2 du format et enregistre les champs suivants lorsque l'EXE est activé. Les fichiers de tâche en version 1 restent lisibles.
windowsExe: true
exeName: MyApp.exe
exeMode: console
exeIcon: assets/app.ico
exeFileVersion: 1.4.2.0
exeProductVersion: 1.4.2.0
exeCompany: Example Inc.
exeProduct: Example Service
exeDescription: Example background service
exeCopyright: Copyright (C) 2026 Example Inc.
9. Dépannage
| Symptôme | Cause et remède |
|---|---|
| Message indiquant qu'une plate-forme cible Windows est nécessaire | L'EXE est activé mais ni windows-x64, ni windows-x86, ni windows-aarch64 n'a été retenu. |
| Message signalant un format de version invalide | Un champ de version contient des lettres ou des espaces, comporte plus de quatre parties, ou l'une d'elles sort de la plage 0–65535. |
| Message indiquant que le nom de l'EXE doit être un simple nom de fichier | Le nom contient un séparateur de chemin. Employez un nom sans répertoire. |
| Message signalant que le fichier d'icône est introuvable | --exe-icon désigne un .ico inexistant. Vérifiez le chemin. |
| Aucune fenêtre après le double-clic, l'application se ferme aussitôt | L'application échoue au démarrage en mode graphique. Refaites l'empaquetage en mode console pour voir la sortie d'erreur. |
| Un EXE copié ailleurs ne fonctionne pas | Le lanceur exige le runtime et l'archive dans le même répertoire de paquet. Copiez tout le répertoire de sortie. |
La liste complète des options figure dans la Référence de la ligne de commande ; l'assistant graphique est décrit dans le Guide de l'interface graphique.