Почему мой JAR файл выполняется в CMD, но не на двойном щелчке?
Итак, я пишу простое приложение 3D GUI, которое я хотел использовать для пользователей, просто дважды щелкнув файл JAR. Я отлично работал, прежде чем помещать его в JAR файл, и я отлично работал в JAR файле во время работы из командной строки (набрав "java -jar Modeler.jar" в каталоге jar файла). Однако, когда я дважды щелкаю по нему, ничего не происходит. Он работает отлично, без ошибок из командной строки. По опыту я знаю, что отчеты о сбоях при запуске не отображаются, потому что консоль не появляется (или она слишком быстро исчезает), но при запуске из командной строки нет отчетов о сбоях. Любые идеи относительно того, почему это не сработает? Я запускаю Windows 7 Home Premium. Вот содержимое файла JAR, если оно помогает:
Modeler.jar
|
+--*all the class files necessary*
|
+--META-INF
|
+--MANIFEST.MF
Содержание 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
РЕДАКТИРОВАТЬ: Итак, после испорчения ассоциаций файлов, чтобы использовать java.exe вместо javaw.exe(тем самым предоставляя окно для распечаток), затем немного изменив механизм запуска, чтобы распечатать текущий рабочий каталог, я обнаружил что jar работает от "C:\Windows\system32" вместо папки на моем рабочем столе, в которую я ее вставлял. Однако перемещение необходимых внешних файлов там ничего не помогает.
EDIT 2: я попытался сделать еще один JAR файл, на этот раз с простым JFrame с кнопкой в нем, которая сообщает вам текущий рабочий каталог. Нажмите кнопку, и он откроет (бесполезный) JFileChooser. Это работало при двойном щелчке, независимо от того, где я положил его на свой компьютер. Поэтому в моем файле JAR должно быть что-то не так. Я снова начну исправлять свою программу.
РЕДАКТИРОВАТЬ 3: Проблема в том, что я думал: это неправильно загружает библиотеки, когда я дважды нажимаю на нее. Странная часть заключается в том, что в моих тестах, где я показываю текущий путь и путь к библиотеке, вывод точно такой же, независимо от того, запускаю ли я его с помощью командной строки или двойным щелчком по нему. Здесь трассировка стека:
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)
Проблема только в том, что она находится в пути к библиотеке. Я специально установил его в программе. Теперь, когда я думаю об этом, это может быть проблемой. Я установил его так (это был метод, который я нашел где-то в Интернете. Я не помню, где):
//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: Ну, после того, как я посмотрел и пересмотрел свой код, я обнаружил, что проблема была в некоторых BS'ery, связанных с обнаружением 64-битных систем, где она загружала неправильные DLL. Почему он работал из командной строки, а не с помощью двойного щелчка, я не знаю и, вероятно, никогда не узнаю, но он работает через двойной щелчок, так что я счастлив. Извините за неприятности.
Ответы
Ответ 1
Просто, чтобы ответить на вопрос ясно всем, кто проходит мимо, я поставлю свое решение здесь (я не мог раньше из-за 8-часового правила):
Хорошо, посмотрев и переосмыслив мой код, я обнаружил, что проблема была в некоторых BS'ery, связанных с обнаружением 64-битных систем, где он загружался неправильная dll. Почему это сработало командной строки, а не через дважды щелкните Я не знаю и буду вероятно, никогда не знаю, но он работает через дважды щелкните сейчас, так что я счастлив. сожалею о проблемах.
Ответ 2
Хорошо, поэтому я больше за неделю придерживался этой точной проблемы (это был для стороннего проекта, для которого я мог посвящать всего несколько часов в день).
Это произошло на моем рабочем столе, но по какой-то причине на ноутбуке этого не произошло.
Посмотрев вокруг, я нашел этот ответ, и я подумал, что поделюсь им для людей, которые похожи на меня, не нашел ничего полезного в принятом ответе здесь. Кредиты отправляются анонимному пользователю Stack Overflow, имя пользователя которого я потерял во всем волнении.
Как уже упоминалось в другом ответе, где-то в кажущейся несвязанной проблеме, используйте эту небольшую программу, чтобы связать ваши файлы JAR с 64-разрядной версией java:
http://johann.loefflmann.net/en/software/jarfix/index.html
Сохраните программу где-нибудь и запустите ее из командной строки с параметром /64:
c://path//jarfix.exe/64
Ничто другое не сработало для меня, но это было похоже на волшебство.:)
Ответ 3
JAR является исполняемым из CMD. Это означает, что сам JAR сформирован правильно. Хорошо.
Единственная причина неудачи в том, что двойной щелчок производит не правильную команду. Ожидаемая команда, как вы правильно сказали,
java -jar Modeler.jar
Но когда вы связываете javaw.exe с расширением JAR, я подозреваю, что он выполняет
javaw Modeler.jar
Легко проверить: создать файл javajar.cmd, содержащий следующие
javaw -jar %*
и связать его с JAR. Если приложение работает нормально, я прав. В противном случае, извините.
Ответ 4
Просто, чтобы положить мои два цента, у меня была эта проблема, и это было вызвано чем-то другим в манифесте, я полагаю. Я решил это, создав исполняемый JAR по-другому:
Предыдущий разработчик сгенерировал Runnable JAR из Eclipse (щелкните правой кнопкой мыши проект → Экспорт... → Runnable JAR), и это отлично работает для всех. Затем я пришел и создал исполняемый JAR, настроив плагин Maven ( "сборка" ) в pom.xml, и поэтому классическая сборка Maven создала бы исполняемый JAR.
Это сработало хорошо для меня (из cmd и двойного щелчка), но не для конечных пользователей (которые все еще могли запускать инструмент из cmd, но не двойным щелчком JAR).
Я создал исполняемый JAR из Eclipse, и теперь все снова счастливы. Непонятно, почему JAR, созданный maven, не мог нормально работать, дважды щелкнув, но я не могу потрудиться, чтобы теперь исследовать, что работа выполнена. Надеюсь, что эта половинная консультация помогает кому-то.
Ответ 5
Мне надоело не изменять ассоциации файлов в панели управления Windows 7 и редактировать реестр (ПРИМЕЧАНИЕ: это не плохая идея, чтобы установить точку восстановления, прежде чем продолжить, если вы считаете, что НИКОГДА не удастся вкрутить up) (я не установил точку восстановления и не прикрутил):
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\" %*"
Это предполагает, что .jar
имеет значение (Default)
jar_auto_file
. Если этого не сделать:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.jar]
@="jar_auto_file"
p.s. Одна из проблем, которые я обнаружил в реестре, заключалась в том, что jarfile
был связан с Netbeans, Chrome и java.exe, а также с Applications\java.exe
. Я удалил весь node (после его экспорта, чтобы я мог вернуть его, если это было необходимо, а это не было). Теперь в моем реестре есть NO jarfile
, и все .jar файлы выполняются по-прежнему.
Это проявляется, отображая более одного типа файлов, связанных с .jar
файлами в панели управления. Вы хотите это:
![enter image description here]()
Если в Рекомендуемых программах указано более одного элемента, найдите реестр для jarfile
и (сначала экспортируйте), удалите node:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jar
Ответ 6
У меня была такая же проблема с .jar файлами после попытки всего, что я понял, что у меня установлено несколько версий Java. Удаление ненужных версий решило мою проблему.
Может быть, потому, что .jar запутался между разными версиями JRE.