Подтвердить что ты не робот

Почему мой 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. Почему он работал из командной строки, а не с помощью двойного щелчка, я не знаю и, вероятно, никогда не узнаю, но он работает через двойной щелчок, так что я счастлив. Извините за неприятности.

4b9b3361

Ответ 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.