web-dev-qa-db-fra.com

Pourquoi mon fichier JAR s'exécute-t-il dans CMD, mais pas en double-clic?

J'ai donc écrit une simple application d'interface graphique 3D que je souhaitais utiliser simplement en double-cliquant sur le fichier JAR. Je l’ai parfaitement fonctionné avant de le placer dans le fichier JAR, et je l’ai parfaitement fonctionné DANS le fichier JAR lors de l’exécution de la commande Invite (en tapant "Java -jar Modeler.jar" dans le répertoire du fichier jar). Cependant, lorsque je double-clique dessus, rien ne se passe. Il fonctionne parfaitement sans erreur de la commande Invite. Je sais par expérience que les rapports d'incident au démarrage ne sont pas affichés car la console n'apparaît pas (ou disparaît trop rapidement), mais lors de l'exécution à partir de la commande Invite, aucun rapport d'incident n'est généré. Des idées sur pourquoi ça ne marchera pas? J'utilise Windows 7 Home Premium. Voici le contenu du fichier JAR si cela vous aide:

Modeler.jar
|
+--*all the class files necessary*
|
+--META-INF
   |
   +--MANIFEST.MF

Contenu de MANIFEST.MF:

Manifest-Version: 1.0
Built-By: AnonymousJohn
Class-Path: bin/j3dcore.jar bin/j3dutils.jar bin/vecmath.jar
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Main-Class: Start

EDIT: Ainsi, après avoir manipulé les associations de fichiers pour utiliser Java.exe au lieu de javaw.exe (fournissant ainsi une fenêtre pour les impressions), puis en modifiant légèrement le mécanisme de démarrage pour imprimer le répertoire de travail actuel, j’ai découvert que le fichier jar est en cours d'exécution à partir de "C:\Windows\system32" au lieu du dossier sur mon bureau, je l'ai mis dans. Allez comprendre. Cependant, déplacer les fichiers externes nécessaires n’aide en rien.

EDIT 2: J'ai essayé de créer un autre fichier JAR, cette fois avec un simple JFrame contenant un bouton indiquant le répertoire de travail en cours. Appuyez sur le bouton pour ouvrir un fichier JFileChooser (inutile). Cela a fonctionné sur le double-clic, peu importe où je l'ai mis dans mon ordinateur. Il doit donc y avoir quelque chose qui ne va pas dans mon fichier JAR. Je vais recommencer à dépanner mon programme.

EDIT 3: Le problème, c’est ce que je pensais: c’est que le chargement des bibliothèques n’est pas correct lorsque je double-clique dessus. La partie étrange est que dans mes tests où j'affiche le chemin actuel et le chemin de la bibliothèque, la sortie est exactement la même, que je l'exécute via la commande Invite ou en double-cliquant dessus. Voici la trace de la pile:

Java.lang.UnsatisfiedLinkError: no j3dcore-d3d in Java.library.path
  at Java.lang.ClassLoader.loadLibrary(Unknown Source)
  at Java.lang.Runtime.loadLibrary0(Unknown Source)
  at Java.lang.System.loadLibrary(Unknown Source)
  at javax.media.j3d.NativePipeline$1.run(NativePipeline.Java:231)
  at Java.security.AccessController.doPrivileged(Native Method)
  at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.Java:200)
  at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.Java:157)
  at javax.media.j3d.MasterControl.loadLibraries(MasterControl.Java:987)
  at javax.media.j3d.VirtualUniverse<clinit>(VirtualUniverse.Java:299)
  at javax.media.j3d.Canvas3D.<clinit>(Canvas3D.Java:3881)
  at ModelPreview.<init>(ModelPreview.Java:51)
  at Modeler.<init>(Modeler.Java:76)
  at Modeler.main(Modeler.Java:1227)
  at Start.main(Start.Java:92)

Seul problème, c’est IS dans le chemin de la bibliothèque. Je l'ai spécifiquement mis dans le programme. Maintenant que j'y pense, c'est peut-être le problème. Je l'ai réglé comme suit (c'est une méthode que j'ai trouvée quelque part sur Internet. Je ne me souviens plus où):

//above was code to get newPath based on the Operating System.
//all this code is set in a try-catch phrase.
//reset the library path
System.setProperty("Java.library.path", ".\\bin\\natives" + newPath + ";");
//make sure the ClassLoader rereads the NEW path.
Field f = ClassLoader.class.getDeclaredField("sys_paths");
f.setAccessible( true );
f.set(null, null); //ClassLoader will automatically reread the path when it sees that it is null.  

EDIT FINAL: Après avoir jeté un œil au code et relooké mon code, j’ai découvert que le problème se trouvait dans certains disques BS qui impliquaient la détection de systèmes 64 bits sur lesquels le chargement des mauvaises dll était mal. Pourquoi cela a-t-il fonctionné en ligne de commande et non via un double-clic? Je ne sais pas et je ne le saurai probablement jamais, mais cela fonctionne maintenant avec un double-clic. Je suis donc heureux. Désolé pour les ennuis.

18
AnonymousJohn

Ok, donc je suis bloqué sur cette question depuis plus d’une semaine maintenant (c’est pour un projet parallèle auquel je ne pouvais consacrer que quelques heures par jour).

Cela s'est produit sur mon ordinateur de bureau, mais pour une raison quelconque, cela ne se produirait pas sur l'ordinateur portable.

Après avoir regardé autour de moi, j'ai trouvé cette réponse et je pensais que je la partagerais avec les personnes qui sont comme moi. Je n'ai rien trouvé d'utile dans la réponse acceptée ici. Les crédits vont à l'utilisateur anonyme Stack Overflow, dont le nom d'utilisateur a été perdu dans l'excitation.

Comme mentionné par une autre réponse quelque part à un problème apparemment sans rapport, utilisez ce petit programme pour associer vos fichiers JAR à la version 64 bits de Java:

http://johann.loefflmann.net/fr/software/jarfix/index.html

Enregistrez le programme quelque part et exécutez-le à partir de la ligne de commande avec le paramètre /64:c://path//jarfix.exe/64

Rien d'autre n'a fonctionné pour moi, mais c'était comme par magie. :)

23
Eric

Le fichier JAR est exécutable à partir de CMD. Cela signifie que le fichier JAR est correctement formé. Bien.

La seule raison d'échouer maintenant est que le double-clic ne produit pas une commande correcte. Comme vous l'avez dit correctement, la commande attendue est 

Java -jar Modeler.jar

Mais lorsque vous associez javaw.exe à une extension JAR, je soupçonne qu’il s’exécute

javaw Modeler.jar

Il est facile à vérifier: créez un fichier javajar.cmd contenant les éléments suivants:

javaw -jar %*

et associez-le à JAR. Si votre application démarre correctement, j'ai raison. Sinon, désolé.

7
Vladimir Dyuzhev

J'en avais marre de ne pas pouvoir modifier les associations de fichiers dans le Panneau de configuration de Windows 7 et d'éditer le registre (REMARQUE: ce n'est pas une mauvaise idée de définir un point de restauration avant de continuer si vous pensez que TOUT risque de se tromper) ( Je n'ai ni mis le point de restauration ni foiré):

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\jar_auto_file]
@=""
"EditFlags"=hex:00,00,00,00

[HKEY_CLASSES_ROOT\jar_auto_file\Shell]

[HKEY_CLASSES_ROOT\jar_auto_file\Shell\open]

[HKEY_CLASSES_ROOT\jar_auto_file\Shell\open\command]
@="\"C:\\Program Files\\Java\\jdk1.7.0_60\\bin\\javaw.exe\" -jar \"%1\" %*"

Cela suppose que les fichiers .jar ont (Default) valeur jar_auto_file. Si ce n'est pas le cas:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.jar]
@="jar_auto_file"

p.s. Un problème que j'ai trouvé dans le registre était que jarfile était associé à Netbeans, Chrome et Java.exe ainsi qu'à Applications\Java.exe. J'ai supprimé l'intégralité de ce nœud (après l'avoir exporté, histoire de le remettre si c'était essentiel; ce n'était pas le cas). Maintenant, il n'y a pas de jarfile dans mon registre et tous les fichiers .jar s'exécutent comme auparavant.

Cela se manifeste par l'affichage de plusieurs types de fichiers associés aux fichiers .jar dans le Panneau de configuration. Tu veux ça:

enter image description here

S'il existe plusieurs éléments dans Programmes recommandés, recherchez dans le registre jarfile et (exportez en premier, ensuite) supprimez ce nœud: 

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jar

1
DSlomer64

J'ai eu le même problème avec les fichiers .jar après avoir tout essayé, mais j'ai réalisé que j'ai plusieurs versions de Java installées. Supprimer les versions inutiles a résolu mon problème. Peut-être parce que le fichier .jar était confondu entre différentes versions de JRE.

0
Muhammad Hamza Shahid

Juste pour mettre mes deux cents, j'ai eu ce problème et il a été causé par quelque chose dans le manifeste, je suppose. Je l'ai résolu en générant le fichier JAR exécutable d'une manière différente:

Le développeur précédent avait généré le fichier JAR Runnable d’Eclipse (projet du bouton droit de la souris -> Exporter ... -> JAR Runnable), ce qui a bien fonctionné pour tout le monde. Ensuite, je suis arrivé et j'ai généré le JAR exécutable en configurant un plugin Maven ("Assembly") dans le fichier pom.xml. Ainsi, une construction classique de Maven produirait le JAR exécutable. 

Cela a bien fonctionné pour moi (à partir de cmd et en double-cliquant), mais pas pour les utilisateurs finaux (qui pouvaient toujours exécuter l'outil depuis cmd, mais pas en double-cliquant sur le fichier JAR).

J'ai généré le fichier JAR exécutable d'Eclipse et maintenant tout le monde est heureux à nouveau. Vous ne savez pas pourquoi le fichier JAR généré par maven n'est pas autorisé à s'exécuter en double-cliquant sur ce bouton, mais je ne peux pas me permettre d'enquêter plus avant maintenant que le travail est terminé. J'espère que ce demi-conseil aide quelqu'un.

0
Peter Perháč