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