为什么我双击不了我的jar文件启动?

4

我在双击 JAR 文件并用 Java SE 打开时遇到了问题,但是在命令行中可以正常启动,我创建的其他 JAR 文件通过双击也可以正常启动。

我使用 Eclipse Exporter 导出 JAR 文件,选择运行配置下的可运行 JAR 导出,并选择正确的 main() 类。

当我使用 java -jar myjar.jar 命令运行 JAR 文件,它按预期运行,没有抛出任何异常。

我在 Linux/Windows 下都遇到了同样的问题,我不太明白为什么,因为我使用相同的方式创建的其他 JAR 文件都可以正常运行。

只是为了好玩,我编写了一个仅包含以下内容的 C 程序:

int main(void){
   system("java -jar myjar.jar");
   return 0;
}

当我双击编译好的c程序时,我的jar文件打开了!以下是清单:

Manifest-Version: 1.0
Class-Path: . libs/commons-compress-1.10.jar libs/zip4j_1.3.2.jar libs/xz.jar libs/commons-io-2.4.jar libs/oat2dex.jar
Main-Class: deodex.Tester

这里是main方法: http://pastebin.com/M8Fhb4qW

package deodex;
import deodex.tools.Logger;
import deodex.ui.LangFrame;
import deodex.ui.Window;
public class Tester {
        public static void main(String args[]) {

        if (Cfg.isFirstLaunch()) {
                    Cfg.setCurrentLang(S.ENGLISH);
                    R.initResources();
                    @SuppressWarnings("unused")
                    LangFrame win = new LangFrame();


        } else {
            Cfg.readCfg();
            R.initResources();
            S.initTempFolders();
            Logger.logToStdIO("[test]" + Cfg.getCurrentLang());

                    @SuppressWarnings("unused")
                    Window win = new Window();



        }

    }
}

提前感谢您的使用

更多细节
我尝试在我的代码之前添加了一个新的JFrame,双击只对显示出来的那个JFrame有效,然后它就挂在那里,其他应该在此之后启动的窗口都没有显示出来,请告诉我该去哪里查找......为什么不起作用?因为看起来我的类需要终端/cmd才能显示出来,这些类扩展了JFram,我还应该注意到,我正在使用一个名为R的类来根据语言从文本文件中加载字符串,并使用Cfg类来检查程序是否首次启动或已经启动,然后加载适当的语言文件和资源。

编辑
如答案所建议的,我删除了所有的JDK并按照描述安装了Oracle的JDK,但仍然存在同样的问题。


2
解释一下你是如何创建 .jar 文件的...有两种类型的 .jar 文件,可执行和非可执行。 - Srinath Ganesh
2
当您双击时会发生/不会发生什么?您所说的操作系统是哪个?Linux?Mac?Windows?Atari?AmigaOS? - Marged
2
请不要使用外部链接来展示您的代码。请将代码直接包含在您的问题中。 - VGR
@Marged 我正在使用 Linux 和 Windows,但在两个系统上都失败了。当从终端启动 JAR 时,程序按预期运行,没有抛出异常。 - Rachid Boudjelida
@VGR 谢谢,我会记住的。请原谅我对规则的无知。 - Rachid Boudjelida
显示剩余3条评论
2个回答

1
我解决了自己的问题,原因如下: 正如我在详细信息中所说,我使用来自JAR文件外部的文本资源,并且我使用硬编码来获取这些资源,例如final File("lang/en.prop")。问题是,当从GUI中使用JAVA SE打开时,就像从其他目录运行命令到我的jar一样,这将失败,因为Cfg类将抛出NullPointerException,因为文本资源不在那里,所以我创建了一个新的类称之为PathUtils,如下所示 PathUtils.java。
    public static String getExcutionPath(){
        String path = "";
        try {
            path =PathUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("Somthing went wrong couldn't detemine our current location !");
        }
        return path.substring(0, path.lastIndexOf("/"));
    }

现在在启动时,我会先找到我的文件系统位置,然后基于当前位置设置程序所需文件的值,现在双击起来非常顺畅!简单易懂。


-1

问题可能出在Java SE运行环境的不正确安装上。您可能需要卸载计算机上所有Java的痕迹,并使用Oracle Technology Network提供的离线安装程序重新安装Java。

在Linux上,添加PPA ppa:webupd8team/java并安装oracle-java8-installer - 据我所知,它与许多桌面环境集成,至少在Ubuntu Unity和XFCE上可以双击运行。


正如我在问题中所说,这绝对不是文件关联问题。 - Rachid Boudjelida
@lord-ralf-adolf 在你说“它不起作用”之前,你尝试过这个解决方案吗?如果你一直在寻找解决方案,最后可能会发现这确实是正确的解决方案,那将非常令人沮丧。 - randers
我已经安装了OPENJDK8、7和6以及Oracle JDK 8,我不明白为什么要重新安装它,只因为我的电脑上成千上万个jar文件中的一个无法在双击或右键单击“使用JAVA 8运行时”打开,请如果您认为这可以帮助我,请解释一下为什么?我的问题很清楚,“为什么”。 - Rachid Boudjelida
1
这就是我怀疑的确切原因:安装了多个并行的Java版本导致混乱。请按照我的建议操作并报告结果。卸载一切并重新安装。如果您不合作,这真的没有帮助任何人。 - randers
好的,我会配合。 抱歉,我刚刚失去了信心。 我会尝试并发布结果。 - Rachid Boudjelida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接