Why does my JAR file execute at CMD, but not on double-click?
因此,我一直在编写一个简单的3D GUI应用程序,旨在让用户只需双击JAR文件即可使用。在将其放入JAR文件之前,它可以正常工作,并且在命令提示符下运行时(在jar文件的目录中键入" java -jar Modeler.jar"),可以在JAR文件中使其完美运行。但是,当我双击它时,什么也没有发生。它运行完美,没有命令提示符下的错误。我从经验中知道,没有显示启动时的崩溃报告,因为控制台没有出现(或者消失得太快),但是从命令提示符运行时没有崩溃报告。关于它为什么行不通的任何想法?我正在运行Windows 7 Home Premium。如果有帮助,以下是JAR文件的内容:
1 2 3 4 5 6 7 | Modeler.jar | +--*all the class files necessary* | +--META-INF | +--MANIFEST.MF |
MANIFEST.MF的内容:
1 2 3 4 5 | 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:问题就是我所想的:双击它时库加载不正确。奇怪的是,在我显示当前路径和库路径的测试中,无论是通过命令提示符还是双击运行它,输出都是完全相同的。这是堆栈跟踪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) |
唯一的问题是它位于库路径中。我在程序中专门设置了它。现在,我考虑可能是问题所在。我这样设置(这是我在互联网上某个地方找到的一种方法。我不记得在哪里):
1 2 3 4 5 6 7 8 9 | //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\ atives" + 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'ery,涉及检测64位系统,该系统加载了错误的dll。为什么它可以从命令行而不是通过双击工作,我不知道并且可能永远不会知道,但是现在通过双击可以工作,所以我很高兴。对不起,麻烦。
好的,所以我在这个确切的问题上停留了一个多星期(这是一个副项目,我每天只能花几个小时)。
这是在我的台式机上发生的,但由于某种原因在笔记本电脑上不会发生。
环顾四周后,我找到了这个答案,我想与像我一样的人分享它,在这里接受的答案中没有发现有用的东西。积分归匿名的Stack Overflow用户使用,我在所有兴奋中都失去了这个用户名。
正如某个似乎无关的问题的其他答案所提到的那样,请使用以下小程序将您的JAR文件与Java的64位版本相关联:
http://johann.loefflmann.net/en/software/jarfix/index.html
将程序保存在某处,并从命令行使用参数/ 64运行它:
c://路径//jarfix.exe / 64
没有别的东西对我有用,但这就像魔术。 :)
JAR可从CMD执行。这意味着JAR本身是正确形成的。好。
现在失败的唯一原因是双击无法生成正确的命令。正如您正确地说的,预期命令是
1 | java -jar Modeler.jar |
但是,当您将javaw.exe与JAR扩展名相关联时,我怀疑它会执行
1 | javaw Modeler.jar |
很容易检查:创建一个javajar.cmd文件,其中包含以下内容
1 | javaw -jar %* |
并将其与JAR相关联。如果您的应用启动正常,那是正确的。否则,对不起。
我受够了无法在Windows 7控制面板中修改文件关联并编辑注册表的问题(注意:如果您认为有任何可能破坏的可能性,那么在继续操作之前设置还原点并不是一个坏主意)(我既没有设置恢复点,也没有搞砸):
1 2 3 4 5 6 7 8 9 10 11 12 | 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" %*" |
假定
1 2 3 4 |
ps。我在注册表中发现的一个问题是
这通过在控制面板中显示与
如果"推荐程序"中显示了多个项目,请在注册表中搜索?x3>并(首先导出,然后)删除该节点:
尝试一切后,我发现.jar文件存在相同的问题,我意识到我已经安装了多个Java版本。删除不必要的版本解决了我的问题。
可能是因为.jar在JRE的不同版本之间造成了混淆。
我只想放两分钱,就遇到了这个问题,它是由清单中的某种东西引起的。我通过以另一种方式生成可执行JAR来解决它:
以前的开发人员是从Eclipse生成Runnable JAR的(右键单击项目-> Export ...-> Runnable JAR),这对每个人都适用。然后,我通过在pom.xml中配置Maven插件("程序集")来生成可运行的JAR,因此经典的Maven构建将生成可运行的JAR。
这对我来说很好(通过cmd并通过双击),但是对最终用户(他们仍然可以从cmd运行该工具,但不能通过双击JAR)不起作用。
我从Eclipse生成了可运行的JAR,现在每个人都再次高兴。不知道为什么maven生成的JAR不能通过双击运行,但是既然工作已经完成,我就不愿意进一步调查。希望这个半忠告能帮助某人。
为了使问题的答案对任何经过的人都很清楚,我将解决方案放在这里(由于8个小时的规则,我不能这样做):
Well, after looking and relooking at
my code, I discovered the problem was
in some BS'ery involving the detection
of 64-bit systems where it was loading
the wrong dll's. Why it worked from
the command-line and not via
double-click I don't know and will
probably never know, but it works via
double-click now, so I'm happy. Sorry
about the troubles.