为什么我的 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-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。为什么它从命令行工作,而不是通过双击,我不知道,可能永远不会知道,但它现在通过双击工作,所以我很高兴。很抱歉给您带来麻烦。