Exigences
Je souhaite publier une application Java GUI sur Windows 7. Cette application utilise le Swing Toolkit et ne nécessite pas de code natif. L'application est installée à l'aide d'un NSIS installateur. Je veux intégrer cette application dans Windows 7 aussi bien que possible. Cela signifie que :
- Lorsque l'application est en cours d'exécution, il doit être possible de l'épingler à la barre des tâches.
- Il doit être possible d'associer des fichiers de données à l'application pour que Windows ouvre ces fichiers avec mon application.
- Doit fonctionner automatiquement avec le Runtime Java 32 bits et avec le Runtime Java 64 bits. Ainsi, lorsque l'utilisateur désinstalle un Java 32 bits et installe un Java 64 bits à la place (ou vice-versa), mon application doit continuer à fonctionner.
- Doit prendre en charge les paramètres de grandes polices de Windows. Je ne comprends pas vraiment cette fonctionnalité. Je sais juste que certaines applications l'ignorent complètement, que d'autres (comme Google Chrome) sont mises à l'échelle des pixels (c'est vraiment moche) et que d'autres la prennent en charge en utilisant simplement des polices plus grandes comme prévu (c'est ce que je veux et cela fonctionne normalement). Seule la solution WinRun4J mentionnée ci-dessous ne fonctionne pas).
Solutions testées
WinRun4J
WinRun4j est un fichier EXE qui lance l'application Java. Comme l'application ne crée pas de nouveau processus Java, Windows pense que le fichier EXE EST l'application. Il n'y a donc pas de problème avec la barre des tâches. Les associations de fichiers fonctionnent parce que les fichiers peuvent être simplement associés au fichier EXE.
Problèmes :
- Ne prend pas en charge les grandes polices. La fenêtre de l'application est réduite au pixel près (comme Google Chrome).
- Deux fichiers EXE différents doivent être utilisés en fonction du JRE installé. Ainsi, lorsque le JRE 64 bits est installé, l'application doit être lancée avec le fichier EXE 64 bits. Lorsque le JRE 32 bits est installé, l'autre EXE doit être utilisé. Ce n'est pas convivial car l'utilisateur ne comprend pas pourquoi il doit utiliser l'EXE 32 bits sur un système d'exploitation 64 bits alors que seul un JRE 32 bits est installé.
Lancement4J
Lancement4J crée un EXE 32 bits qui lance un processus Java externe pour démarrer l'application Java. Ainsi, contrairement à WinRun4J, il peut également lancer une application Java 64 bits.
Problèmes :
- Impossible d'épingler l'application à la barre des tâches.
System.out.println
n'imprimera pas sur la console siheaderType="gui"
, même si l'application est lancée à partir de la console.
JAR
Sous Windows, il suffit de double-cliquer sur le fichier JAR pour lancer l'application. L'installation de JRE n'a pas d'importance, cela fonctionne simplement. Mais...
Problèmes :
- L'application ne peut pas être épinglée à la barre des tâches.
- Impossible de créer un raccourci dans le menu Démarrer.
- Impossible d'associer des fichiers à un fichier JAR.
BAT/CMD
Un simple fichier batch comme celui-ci peut être utilisé pour démarrer l'application :
@echo off
start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1
Un raccourci peut être créé pour ce fichier batch afin de définir une icône personnalisée.
Problèmes :
- Une fenêtre DOS s'ouvre au démarrage de l'application.
- Le fichier batch ne sait pas où se trouve javaw.exe. En fonction de la version de Java (32 ou 64 bits) installée, il peut se trouver à l'emplacement suivant
c:\windows\syswow64
et Windows ne redirige pas automatiquement cet appel à partir des fichiers batch. L'utilisation de la fonctionJAVA_HOME
est également à proscrire, car Java ne la définit pas automatiquement. - Lors de l'association de fichiers avec le fichier batch, aucune icône personnalisée ne peut être définie.
- La prise en charge de la barre des tâches ne fonctionne pas correctement. L'application peut être épinglée à la barre des tâches lorsque le fichier batch est lancé manuellement, mais lorsque l'on double-clique sur un fichier associé, cela ne fonctionne pas.
Raccourci
Au lieu d'utiliser un fichier batch, il est possible de créer un raccourci pour démarrer l'application. Il renvoie à cette commande : c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar"
. Windows redirige automatiquement cet appel vers le répertoire SysWOW64 si un JRE Java 32 bits est installé.
Problèmes :
- Il n'est pas possible d'y associer des fichiers car Windows n'accepte que les fichiers EXE/COM/PIF/BAT/CMD comme cibles d'association. Les fichiers LNK ne fonctionnent pas.
Question
Existe-t-il une autre solution qui réponde à toutes les exigences susmentionnées ? Ou existe-t-il des astuces pour résoudre les problèmes posés par les solutions mentionnées ?
Solution
Après avoir résolu le problème de l'épinglage de la barre des tâches à l'aide de la fonction Launch4j semble être la meilleure solution. Launch4j peut facilement être intégré dans un projet Maven (avec cette ou cette ), la configuration est assez facile et tout fonctionne dans la boîte, sauf l'épinglage de la barre des tâches. Pour l'épinglage de la barre des tâches, l'application Java doit définir un appModelUserId comme expliqué dans la réponse à la question cette question .
En outre, l'application Java doit être installée par un programme d'installation qui doit au moins installer un raccourci pointant vers l'EXE. Ce raccourci doit également contenir l'appModelUserId. Avec NSIS, cela peut être fait avec la commande Plugin WinShell et une configuration comme celle-ci :
CreateShortCut "$SMPROGRAMS\MyApp.lnk" \
"$INSTDIR\myapp.exe" "" "$INSTDIR\myapp.exe" 0 SW_SHOWNORMAL
WinShell::SetLnkAUMI "$SMPrograms\MyApp.lnk" "MyAppModelUserId"
Pour une raison inconnue, ce raccourci doit exister. Vous n'êtes pas obligé de l'utiliser. Vous pouvez double-cliquer sur l'EXE et l'épinglage sur la barre des tâches fonctionne toujours. Vous pouvez même créer le raccourci dans un sous-dossier de votre dossier d'application. L'épinglage de la barre des tâches cesse de fonctionner lorsque le dernier raccourci du fichier EXE est supprimé.