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

2022-09-02 09:36:14

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


答案 1

好吧,所以我在这个问题上停留了一个多星期(这是一个副项目,我每天只能花几个小时)。

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

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

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

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

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

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


答案 2

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

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

java -jar Modeler.jar

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

javaw Modeler.jar

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

javaw -jar %*

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


推荐