所以我一直在编写一个简单的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(VirtualUniverse.java:299) at javax.media.j3d.Canvas3D. (Canvas3D.java:3881) at ModelPreview. (ModelPreview.java:51) at Modeler. (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.为什么它从命令行工作而不是通过双击我不知道也许可能永远不会知道,但它现在通过双击工作,所以我很高兴.抱歉,麻烦.
好吧,所以我在这个问题上坚持了一个多星期了(这是一个侧面项目,我每天只能投入几个小时).
这发生在我的桌面上,但出于某种原因不会发生在笔记本电脑上.
环顾四周后,我找到了这个答案,我想我会和像我一样的人分享它,在这里接受的答案中没有任何用处.积分转到匿名Stack Overflow用户,用户名字我在所有兴奋中丢失了.
正如某些其他答案所提到的看似无关的问题所述,使用这个小程序将您的JAR文件与64位版本的java相关联:
http://johann.loefflmann.net/en/software/jarfix/index.html
将程序保存到某处并使用参数/ 64:c://path//jarfix.exe/64从命令行运行它
没有别的东西适合我,但这就像魔术一样.:)
JAR可从CMD执行.这意味着JAR本身正确形成.好.
现在失败的唯一原因是双击产生的不是正确的命令.正如你所说的那样,预期的命令是
java -jar Modeler.jar
但是,当您将javaw.exe与JAR扩展名关联时,我怀疑它会执行
javaw Modeler.jar
很容易检查:创建一个包含以下内容的javajar.cmd文件
javaw -jar %*
并将其与JAR联系起来.如果你的应用程序启动正常,我是对的.不然,抱歉.