web-dev-qa-db-fra.com

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

Exigences

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:

  • 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 afin que Windows ouvre ces fichiers avec mon application.
  • Doit fonctionner automatiquement avec le 32 bits Java Runtime et avec le 64 bits Java runtime. Ainsi, lorsque l'utilisateur désinstalle un 32 bits Java et installe un 64 bits Java à la place (ou vice-versa) alors mon application doit encore fonctionner.
  • Doit prendre en charge le paramètre de grandes polices de Windows. Je ne comprends pas vraiment cette fonctionnalité. Je sais juste que certaines applications l'ignorent complètement, d'autres (comme Google Chrome) sont à l'échelle des pixels (semble vraiment moche) et d'autres le prennent en charge en utilisant simplement des polices plus grandes comme prévu (c'est ce que je veux et normalement cela fonctionne. Seule la solution WinRun4J mentionné ci-dessous ne fonctionne pas avec).

Solutions testées

WinRun4J

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:

  • Ne prend pas en charge les grandes polices. La fenêtre de l'application est à l'échelle du pixel (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 démarrée avec le fichier EXE 64 bits. Lorsque des ins JRE 32 bits sont installés, 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 lorsque seul un JRE 32 bits est installé.

Launch4J

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:

  • Impossible d'épingler l'application à la barre des tâches.
  • System.out.println n'imprimera pas sur la console si headerType="gui", que l'application démarre à partir de la console.

JAR

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:

  • L'application ne peut pas être épinglée dans 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 de commandes pour définir une icône personnalisée.

Problèmes:

  • Une fenêtre DOS apparaît au démarrage de l'application.
  • Le fichier de commandes ne sait pas où se trouve javaw.exe. Selon la version Java (32 ou 64 bits) installée, elle peut être située dans 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.
  • Lorsque vous associez des fichiers au fichier de commandes, 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 y être épinglée lorsque le fichier de commandes est démarré manuellement, mais lorsque vous double-cliquez sur un fichier associé à la place, cela ne fonctionne pas.

Raccourci

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:

  • Impossible 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épond à toutes les exigences d'en haut? Ou existe-t-il des astuces pour résoudre les problèmes avec les solutions mentionnées?

Solution

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

36
kayahr

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.

7
Durandal

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.

6
Dmitri

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/ ).

2
Yanflea

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?

1
DotJava

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.

1
Daniel Pryden