36 votes

Quelle est la meilleure façon de démarrer des applications Java sous Windows 7 ?

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 si headerType="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 fonction JAVA_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é.

7voto

Durandal Points 9434

Essayez Launch4j ( http://launch4j.sourceforge.net/ ), il s'agit d'un simple wrapper de jar à exe (le wrapper de jar est en fait optionnel). Il devrait répondre à vos besoins en matière d'icônes et de barre des tâches. Il est également capable de localiser les JRE installés (quelques règles configurables). Je ne comprends pas bien le problème des polices, Swing devrait utiliser automatiquement les polices en fonction des paramètres de Windows, à moins que vous ne les écrasiez d'une manière ou d'une autre dans les options du JRE ou dans le code.

6voto

Dmitri Points 4199

Java Web Start - De nos jours, je n'envisagerais pas de distribuer une application d'une autre manière.

L'utilisateur doit disposer d'au moins J2SE 1.4 ; si vos applications nécessitent une version plus récente, Web Start téléchargera automatiquement un JRE approprié.

Voir le JNLP pour les balises d'intégration des postes de travail ( shortcut y offline-allowed ), et les associations de fichiers ( association ). Ceux-ci ne sont cependant pris en charge que dans WS 1.5.

2voto

Yanflea Points 1817

J'utilise personnellement Launch4j (via maven avec l'option maven-launch4j-plugin pour être encore plus précis), et j'implémente la gestion de la barre des tâches à partir de mon application... (Voir http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/ ).

1voto

Daniel Pryden Points 22167

J'ai eu de bons résultats avec WinRun4J dans l'ensemble, mais je n'ai pas vraiment fait grand-chose avec les polices, donc je dois avouer que je ne suis pas sûr de comprendre pourquoi vous rencontrez le problème que vous décrivez.

D'après ce que vous décrivez, cependant, il semble que vous ayez des exigences très spécifiques à l'égard d'un lanceur natif Java. Pourquoi ne pas écrire le vôtre ? Vous pourriez commencer avec quelque chose comme WinRun4J (qui est open source, sous licence Eclipse CPL) et le modifier pour l'adapter à vos besoins.

Vous pouvez également vous intéresser aux lanceurs natifs utilisés par d'autres programmes. Les lanceurs d'Eclipse et de NetBeans semblent tous deux fonctionner assez bien et sont tous deux open source. Vous pourrez peut-être adapter l'un d'entre eux assez facilement.

1voto

DotJava Points 13

Par ailleurs, la nouvelle fonctionnalité qui permet d'afficher votre application dans la barre d'outils ou la barre de système est également intéressante :

Oracle dispose d'un tutoriel sur l'utilisation de la barre d'état système.

Il s'agit de Java SE 6 - .... - et je me demande si la nouvelle version de Java 7 pourrait offrir d'autres avantages.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X