Je souhaite publier une application graphique Java GUI sous Windows 7. Cette application utilise le Swing Toolkit et ne nécessite aucun code natif. L'application est installée à l'aide d'un NSIS installer. Je souhaite intégrer cette application dans Windows 7 aussi bien que possible. Cela signifie:
WinRun4j est un fichier EXE qui lance l'application Java. Parce que l'application ne crée pas de nouveau processus Java Java, Windows pense que le Fichier EXE IS l'application. Il n'y a donc pas de problème avec la barre des tâches. Les associations de fichiers fonctionnent car les fichiers peuvent être simplement associés au fichier EXE.
Problèmes:
Launch4J crée un EXE 32 bits qui lance un processus externe Java pour démarrer l'application Java. Donc, contrairement à WinRun4J, il peut également démarrer un Java 64 bits.
Problèmes:
System.out.println
n'imprimera pas sur la console si headerType="gui"
, que l'application démarre à partir de la console.Sous Windows, vous pouvez simplement double-cliquer sur le fichier JAR pour démarrer l'application. JRE installé n'a pas d'importance, fonctionne simplement. Mais...
Problèmes:
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 de commandes pour définir une icône personnalisée.
Problèmes:
c:\windows\syswow64
à la place et Windows ne redirige pas automatiquement cet appel à partir de fichiers batch. En utilisant le Java_HOME
La variable d'environnement est également interdite car Java ne définit pas cela automatiquement.Au lieu d'utiliser un fichier batch, il est possible de créer uniquement 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 32 bits Java JRE est installé.
Problèmes:
Existe-t-il une autre solution qui répond à toutes les exigences d'en haut? Ou existe-t-il des astuces pour résoudre les problèmes avec les solutions mentionnées?
Après avoir résolu le problème d'épinglage de la barre des tâches en utilisant Launch4j ressemble à la meilleure solution. Launch4j peut facilement être intégré dans un projet Maven (avec le plugin this ou this ), la configuration est assez facile et tout fonctionne hors de la boîte, sauf l'épinglage de la barre des tâches. Pour épingler la barre des tâches, l'application Java doit définir un appModelUserId comme expliqué dans la réponse à cette question .
De plus, l'application Java doit être installée par un programme d'installation qui doit au moins installer un raccourci pointant vers EXE. Ce raccourci doit également contenir l'appModelUserId. Avec NSIS, cela peut être fait avec le 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 seulement exister. Vous n'êtes pas obligé de l'utiliser. Vous pouvez double-cliquer sur EXE et l'épinglage de 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é.
Essayez Launch4j ( http://launch4j.sourceforge.net/ ), c'est un simple wrapper jar pour exe (en fait, le jar est en option). Cela devrait résoudre vos exigences en matière d'icônes et de barre des tâches. Il est également capable de localiser les JRE installés (certaines règles configurables). Le problème de police que je ne comprends pas tout à fait, Swing devrait automatiquement utiliser des polices en fonction des paramètres de Windows, sauf si vous écrasez cela dans les options JRE ou dans le code.
Java Web Start - Je n'envisagerais pas de distribuer une application autrement, de nos jours.
L'utilisateur doit avoir au moins J2SE 1.4; si vos applications ont besoin d'une version ultérieure, Web Start télécharge automatiquement un JRE approprié.
Voir la référence JNLP pour les balises pour l'intégration au bureau (shortcut
et offline-allowed
) et les associations de fichiers (association
). Ceux-ci ne sont cependant pris en charge que dans WS 1.5.
J'utilise personnellement Launch4j (via maven avec le maven-launch4j-plugin pour être encore plus précis), et j'implémente la gestion de la barre d'état système depuis mon application ... (Voir http://Java.Sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/ ).
Soit dit en passant, consultez également la nouvelle fonctionnalité pour avoir votre application dans la barre d'outils/systemtray:
Oracle a un tutoriel sur la façon d'utiliser la barre d'état système.
C'est Java lié à SE 6 .... me fait également savoir quels autres goodies pourraient être dans le nouveau Java 7?
J'ai eu un bon succès avec WinRun4J dans l'ensemble, mais je n'ai pas vraiment fait grand-chose avec les polices, donc j'avoue que je ne suis pas sûr de comprendre pourquoi vous rencontrez le problème que vous décrivez là-bas.
D'après ce que vous décrivez, cependant, il semble que vous ayez des exigences très spécifiques d'un lanceur natif Java. Pourquoi ne pas simplement écrire le vôtre? Vous pouvez commencer avec quelque chose comme WinRun4J (qui est open source, sous licence Eclipse CPL) et il suffit de le modifier selon vos besoins.
Alternativement, vous pouvez regarder les lanceurs natifs utilisés par d'autres programmes. Les lanceurs Eclipse et NetBeans semblent tous deux fonctionner assez bien, et les deux sont open source. Vous pourrez peut-être également adapter l'un d'eux assez facilement.