Вы должны описать вашу проблему и решение более подробно, чтобы другие люди с подобной проблемой могли извлечь выгоду из вашего опыта. Эрик написал одно хорошее решение в своем ответе здесь.

му я писал простое приложение с трехмерным графическим интерфейсом, которое предназначалось для пользователей, просто щелкнув дважды по файлу 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» вместо папки на моем рабочем столе, я вставил его. Однако перемещение необходимых внешних файлов там не поможет.

РЕДАКТИРОВАТЬ 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.  

РЕДАКТИРОВАТЬ ЗАКЛЮЧИТЕЛЬНО: Хорошо, посмотрев и пересмотрев мой код, я обнаружил, что проблема была в некоторых BS'ах, связанных с обнаружением 64-битных систем, где он загружал неправильные DLL. Почему это работает из командной строки, а не с помощью двойного щелчка, я не знаю и, вероятно, никогда не узнаю, но теперь это работает с помощью двойного щелчка, поэтому я счастлив. Извините за проблемы.

Ответы на вопрос(6)

Ваш ответ на вопрос