为什么我的JAR文件在CMD上执行,而不是双击?

时间:2011-04-29 02:12:18

标签: java jar executable-jar

所以我一直在编写一个简单的3D GUI应用程序,我希望用户只需双击JAR文件就可以使用它。在将它放入JAR文件之前我完全正常工作,并且在从命令提示符运行时在JAR文件中完美地工作(在jar文件的目录中键入“java -jar Modeler.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.  

EDIT FINAL:好吧,在查看和查看我的代码之后,我发现问题出现在一些BS中,涉及64位系统的检测,它正在加载错误的dll。为什么它从命令行工作而不是通过双击我不知道也许可能永远不会知道,但它现在通过双击工作,所以我很高兴。抱歉有问题。

7 个答案:

答案 0 :(得分:24)

好的,所以我在这个问题上坚持了一个多星期了(这是一个侧面项目,我每天只能投入几个小时)。

这发生在我的桌面上,但出于某种原因不会发生在笔记本电脑上。

环顾四周后,我找到了这个答案,我想我会和像我一样的人分享它,在这里接受的答案中没有任何用处。积分转到匿名Stack Overflow用户,用户名字我已经失去了所有的兴奋点。

正如某些其他答案中提到的一个看似无关的问题,使用这个小程序将您的JAR文件与64位版本的java关联:

http://johann.loefflmann.net/en/software/jarfix/index.html

将程序保存到某处并使用参数/ 64从命令行运行它: c://path//jarfix.exe / 64

没有其他任何对我有用,但这就像魔术一样。 :)

答案 1 :(得分:7)

JAR可从CMD执行。这意味着JAR本身正确形成。好。

现在失败的唯一原因是双击产生的不是正确的命令。正如你所说的那样,预期命令是

java -jar Modeler.jar

但是当你将javaw.exe与JAR扩展名关联时,我怀疑它会执行

javaw Modeler.jar

很容易检查:制作一个javajar.cmd文件,其中包含以下内容

javaw -jar %*

并将其与JAR关联。如果你的应用程序启动正常,我是对的。否则,抱歉。

答案 2 :(得分:1)

我厌倦了无法修改Windows 7控制面板中的文件关联并编辑了注册表(注意:如果您认为有可能在某些情况下拧紧,那么在继续之前设置还原点并不是一个坏主意()我既没有设置恢复点也没有搞砸了):

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。如果不这样做:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.jar]
@="jar_auto_file"

P.S。我在注册表中发现的一个问题是,jarfile与Netbeans,Chrome和java.exe以及Applications\java.exe相关联。我删除了整个节点(在导出之后,如果它是必要的话我可以把它放回去;它不是)。现在我的注册表中没有jarfile,所有.jar文件都像以前一样执行。

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

enter image description here

如果推荐程序中显示的项目不止一个,请在jarfile搜索注册表,然后(首先导出)删除该节点:

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

答案 3 :(得分:0)

只是为了把我的两分钱,我有这个问题,它是由清单中的某些东西引起的,我想。我通过以不同的方式生成可执行JAR来解决它:

之前的开发人员从Eclipse生成了Runnable JAR(右键单击项目 - &gt; Export ... - &gt; Runnable JAR),这对每个人都很好。然后我通过在pom.xml中配置Maven插件(&#34; assembly&#34;)来生成可运行的JAR,因此经典的Maven构建将生成可运行的JAR。

这对我来说很有效(通过双击来自cmd ),但不适用于最终用户(他们仍然可以从cmd运行该工具,但不能通过双击JAR)

我从Eclipse生成了可运行的JAR,现在每个人都很开心。不确定为什么maven生成的JAR不能通过双击运行,但是现在我已经不能再进行调查了。希望这个半建议可以帮助别人。

答案 4 :(得分:0)

在尝试了所有我意识到我安装了多个Java版本之后,我遇到了与.jar文件相同的问题。删除不必要的版本解决了我的问题。  可能是因为.jar在不同版本的JRE之间混淆了。

答案 5 :(得分:0)

先决条件:确保已安装 JRE(包含在 JDK 中)。

解决方案

  1. 打开 regedit 并导航到 Computer\HKEY_CLASSES_ROOT\jar_auto_file\shell\open\command

  2. 将“-jar”添加到值数据。例如,从 "C:\Program Files\Java\jdk-15.0.1\bin\java.exe" "%1" 更改为 "C:\Program Files\Java\jdk-15.0.1\bin\java.exe" "-jar" "%1"

  3. 完成

如果问题仍然存在,请确保在项目属性中配置正确的主类。

答案 6 :(得分:-4)

只是为了让问题的答案对于路过的人都清楚,我会把我的解决方案放在这里(因为8小时规则,我之前无法解决):

  瞧,看完后再看看   我的代码,我发现问题是   在某些涉及检测的BS中   它正在加载的64位系统   错误的dll。为什么它起作用   命令行而不是通过   双击我不知道也会   可能永远不会知道,但它的工作原理   现在双击,所以我很高兴。抱歉   关于麻烦。