Pourquoi mon fichier JAR à exécuter CMD, mais pas sur le double-clic?
Donc j'ai écrit une simple interface graphique 3D application que j'ai prévu pour les utilisateurs d'utiliser simplement en double-cliquant sur le fichier JAR. Je l'ai eu il fonctionne parfaitement avant de les mettre dans le fichier JAR, et je l'ai eu il fonctionne parfaitement DANS le fichier JAR lors de l'exécution à partir de l'invite de commande (taper "java-jar Modeler.jar" alors que dans le répertoire du fichier jar). Cependant, lorsque je double-clique, rien ne se passe. Il fonctionne parfaitement bien avec pas d'erreurs à partir de l'invite de commande. Je sais par expérience que les rapports de plantage au démarrage ne sont pas indiqués parce que la console ne s'affiche pas (ou il disparaît trop vite), mais lors de l'exécution à partir de l'invite de commande il n'y a pas de rapports d'incident. Toutes les idées pour lesquelles cela ne fonctionnera pas? Je suis sous Windows 7 Home Premium. Voici le contenu du fichier JAR si cela aide:
Modeler.jar
|
+--*all the class files necessary*
|
+--META-INF
|
+--MANIFEST.MF
Contenu MANIFESTE.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: Alors après de jouer avec les associations de fichier à utiliser java.exe au lieu de javaw.exe (ce qui a permis de fournir une fenêtre pour les impressions), puis de modifier le mécanisme de démarrage un peu d'imprimer le répertoire de travail actuel, j'ai découvert que le pot est en cours d'exécution à partir de "C:\Windows\system32" au lieu de le dossier sur mon bureau, je l'ai mis dans. Aller à la figure. Toutefois, le déplacement du nécessaire en dehors de fichiers, il n'aide pas quelque chose.
EDIT 2: j'ai essayé de faire un autre fichier JAR, cette fois-ci avec un simple JFrame avec un bouton qui vous indique le répertoire de travail courant. Appuyez sur le bouton et ça s'ouvre un (inutile) JFileChooser. Cela a fonctionné sur double-cliquez n'importe où je l'ai mis dans mon ordinateur. Donc il doit y avoir quelque chose de mal avec mon fichier JAR. Je vais commencer le dépannage de mon programme.
EDIT 3: Le problème est juste que je pensais que c'était: il n'est pas le chargement des librairies correctement quand je double-cliquez sur elle. Ce qui est curieux, c'est que dans mes tests où j'affiche le chemin d'accès actuel et le chemin de la bibliothèque, le résultat est exactement le même si je le lance via l'invite de commande ou via un double-clic. 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 est qu'il EST dans le chemin de la bibliothèque. J'ai spécifiquement définie dans le programme. Maintenant que j'y pense c'est peut être le problème. Je l'ai mis comme (c'était une méthode que j'ai trouvé quelque part sur internet. Je ne sais 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: eh Bien, après la recherche et de relooking à mon code, j'ai découvert que le problème était dans certains BS'ery impliquant la détection de 64 bits des systèmes où il était en train de charger le mauvais dll. Pourquoi cela a fonctionné à partir de la ligne de commande et non pas par un double clic, je ne sais pas et ne saurai sans doute jamais, mais qu'il fonctionne via double-cliquez maintenant, donc je suis heureux. Désolé pour les ennuis.
- "Commencer" le nom de votre classe que vous essayez de courir? Est-il dans la valeur par défaut (pas) d'un paquet?
- Oui, "Start" est le nom de la classe, je suis en train de lancer (il met en place l'environnement), et oui, c'est dans le package par défaut. J'ai essayé d'obtenir de l'emballage de travailler à un moment, mais cela ne fonctionnait pas, donc j'ai laissé tout par défaut dans le package.
- Double Possible de stackoverflow.com/questions/394616/running-jar-file-in-windows
- Oups, je suppose que j'ai manqué. Je vais essayer cette solution et d'obtenir de retour avec une mise à jour.
- Cette solution n'a pas aidé. Il ne s'est toujours pas lancé. J'ai vérifié CMD encore et toujours travaillé à partir de là.
- Une remarque: la configuration de java.de la bibliothèque.chemin d'accès en java est inutile. Cette propriété doit être définie qu'au cours de la JVM de l'instanciation. Ensuite, il peut être changé, mais la nouvelle valeur est ignorée.
Vous devez vous connecter pour publier un commentaire.
Ok, donc j'étais coincé sur ce problème précis pendant plus d'une semaine maintenant (il a été pour un projet pour lequel je ne pouvais consacrer quelques heures à une journée).
Ce qui est arrivé sur mon bureau, mais pour une raison quelconque ne serait pas le cas sur l'ordinateur portable.
Après avoir regardé autour, j'ai trouvé cette réponse et je pensais que je voudrais partager pour les gens qui sont comme moi, n'a rien trouvé utile dans l'acceptation de réponse ici. Les crédits vont à anonyme de Débordement de Pile utilisateur, que nom d'utilisateur j'ai perdu dans l'enthousiasme.
Comme l'a mentionné une autre réponse quelque part à un semblant problème indépendant, utiliser ce petit programme pour associer vos fichiers JAR à la version 64 bits de java:
http://johann.loefflmann.net/en/software/jarfix/index.html
Enregistrer le programme et l'exécuter en 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 de la magie. 🙂
Le POT est exécutable à partir de CMD. Cela signifie que le POT lui-même est formé correctement. Bon.
La seule raison de l'échec est que, actuellement, double-cliquez sur ne produit pas un bon de commande. Prévu de commande, comme vous l'avez justement dit, est
Mais lorsque vous associez javaw.exe avec un POT de l'extension, je pense qu'elle exécute
Il est facile de vérifier: faire un javajar.cmd fichier, contenant les éléments suivants
et de l'associer avec JAR. Si vous application démarre OK, je suis de droite. Sinon, désolé.
J'en ai eu marre de ne pas être en mesure de modifier les associations de fichiers dans Windows 7 Panneau de commande et d'éditer la base de registre (REMARQUE: il n'est pas une mauvaise idée de définir un point de restauration avant de procéder si vous pensez qu'il y a TOUTE chance que vous pourriez vis)(I ni point de restauration, ni vissé vers le haut):
Cela suppose que
.jar
fichiers ont(Default)
valeurjar_auto_file
. Si ce n'est pas cela:p.s. Un problème que j'ai trouvé dans la base de registre a été que
jarfile
a été associée avec Netbeans, Chrome, et java.exe ainsi qu'avecApplications\java.exe
. J'ai supprimé l'ensemble de ce nœud (après l'exportation, juste pour que je puisse le remettre s'il était essentiel; il n'était pas). Maintenant, il n'y a PAS dejarfile
dans ma base de registre et de tous .les fichiers jar exécuter comme avant.Cela se manifeste en montrant plus d'un type de fichier associé
.jar
fichiers dans le Panneau de Contrôle. Vous voulez que ce:Si il n'y a plus d'un élément illustré dans les programmes Recommandés, recherche de registre pour
jarfile
et (exportation d'abord, puis) supprimer ce nœud:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jar
.reg
fichier, modifié le chemin d'accès vers le fichier EXE (le mien était une version différente, et un JRE au lieu d'un JDK), et il a résolu le problème immédiatement. Je souhaite que je pourrais donner plus qu'un simple vote.Juste pour mettre mon grain de sel, j'ai eu ce problème et il a été causé par quelque chose-ou-autre dans le manifeste, je suppose. J'ai résolu par la génération de l'exécutable JAR d'une manière différente:
Développeur précédent généré le Runnable JAR à partir d'Eclipse (cliquez-droit sur le projet -> Export... -> Runnable JAR) et cela a bien fonctionné pour tout le monde. Puis je suis venu le long et a généré le runnable JAR par la configuration d'un plugin Maven ("l'assemblée") dans le pom.xml et donc, un classique Maven build serait de produire l'exécutable JAR.
Cela fonctionnait bien pour moi (cmd et par double-clic), mais pas pour les utilisateurs finaux (qui pourrait encore exécuter l'outil de cmd, mais pas en double-cliquant sur le POT).
J'ai généré le runnable JAR à partir d'Eclipse et maintenant tout le monde est heureux à nouveau. Je ne sais pas pourquoi le maven-JAR généré n'était pas ok pour exécuter en double-cliquant sur, mais je ne peux pas être pris la peine d'enquêter plus loin, maintenant que le travail est fait. Espérons que cette demi-conseils en aide à quelqu'un.
J'ai eu le même problème avec .les fichiers jar après avoir tout essayer, j'ai réalisé que j'ai plusieurs versions de Java installées. En supprimant les versions inutiles résolu mon problème.
Peut-être parce que l' .pot était confus entre les différentes versions de JRE.
Juste pour que la réponse à la question est clair pour tout le monde passe, je vais mettre ma solution ici (je n'ai pas de raison de 8 heures de la règle):