关于java:为什么我的JAR文件在CMD上执行,但是在双击时却不能执行?

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" %*"

假定.jar文件的(Default)jar_auto_file。如果没有这样做:

1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.jar]
@="jar_auto_file"

ps。我在注册表中发现的一个问题是jarfile与Netbeans,Chrome和java.exe以及Applications\java.exe相关联。我删除了整个节点(导出后,只是为了将它放回原处就可以放回去;不是)。现在,我的注册表中没有jarfile,并且所有.jar文件都像以前一样执行。

这通过在控制面板中显示与.jar文件关联的一种以上文件类型来体现。你要这个:

enter image description here

如果"推荐程序"中显示了多个项目,请在注册表中搜索并(首先导出,然后)删除该节点:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jar


尝试一切后,我发现.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.