首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的JAR文件在CMD执行,而不是在双击时执行?

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

Stack Overflow用户
提问于 2011-04-29 10:12:18
回答 4查看 36.8K关注 0票数 20

因此,我一直在编写一个简单的3D GUI应用程序,用户只需双击JAR文件即可使用。在将其放入JAR文件之前,我将其完美地工作,并且在从命令提示符(在JAR文件的目录中输入"java -jar Modeler.jar“)运行时,我使其在jar文件中完美地工作。但是,当我双击它时,什么也没有发生。它运行得很好,在命令提示符下没有任何错误。我从经验中知道,启动时的崩溃报告不会显示,因为控制台没有出现(或者它消失得太快),但当从命令提示符运行时,没有崩溃报告。关于它为什么不能工作有什么想法吗?我运行的是Windows 7家庭高级版。如果JAR文件有帮助,下面是它的内容:

代码语言:javascript
复制
Modeler.jar
|
+--*all the class files necessary*
|
+--META-INF
   |
   +--MANIFEST.MF

MANIFEST.MF的内容:

代码语言:javascript
复制
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:问题正如我所想的那样:当我双击它时,它不能正确地加载库。奇怪的是,在我显示当前路径和库路径的测试中,无论是通过命令提示符还是双击它,输出都是完全相同的。下面是堆栈跟踪:

代码语言:javascript
复制
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)

唯一的问题是它在库路径中。我特别在程序中设置了它。现在我想这可能就是问题所在。我是这样设置的(这是我在互联网上找到的一种方法。我不记得在哪里):

代码语言:javascript
复制
//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.  

最后编辑:嗯,在看了又看我的代码后,我发现问题出在一些涉及检测64位系统的错误dll的地方。为什么它从命令行而不是双击工作,我不知道,也可能永远不会知道,但它现在通过双击工作,所以我很高兴。很抱歉给你带来了麻烦。

EN

回答 4

Stack Overflow用户

发布于 2013-06-24 15:57:02

好了,我被这个问题困扰了一个多星期(这是为了一个副业,我每天只能为此花几个小时)。

这在我的台式机上发生了,但由于某种原因,在笔记本电脑上不会发生。

在环顾四周后,我找到了这个答案,我想把它分享给像我一样的人,在这里找到的答案中没有任何有用的东西。功劳归于匿名Stack Overflow用户,我在所有的兴奋中失去了他的用户名。

正如在其他地方对一个看似无关的问题的回答所提到的,使用这个小程序将您的JAR文件与64位版本的java关联起来:

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

将程序保存在某个位置,并使用参数/64从命令行运行它: c://path//jarfix.exe /64

其他的对我来说都不管用,但这就像魔法一样。:)

票数 28
EN

Stack Overflow用户

发布于 2011-04-29 11:03:39

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

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

代码语言:javascript
复制
java -jar Modeler.jar

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

代码语言:javascript
复制
javaw Modeler.jar

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

代码语言:javascript
复制
javaw -jar %*

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

票数 8
EN

Stack Overflow用户

发布于 2015-05-24 08:07:07

我受够了不能在Windows 7控制面板中修改文件关联,并编辑了注册表(注意:如果你认为有可能搞砸,在继续之前设置还原点并不是一个坏主意)(我既没有设置还原点,也没有搞砸):

代码语言:javascript
复制
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。如果不是,请执行以下操作:

代码语言:javascript
复制
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.jar]
@="jar_auto_file"

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5827164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档