为什么我的 jar 文件不能在双击时启动?

Why doesn't my jar file launch on double click?

我在双击启动 jar 文件时遇到问题(并使用 java SE 打开),jar 从命令行启动得很好,我创建的其他 jar 可以通过双击启动。

我使用 eclipse exporter 导出了 jar 文件,我使用了 运行nable jar export 并在 运行 配置下选择了正确的 main() class

当我 运行 使用 java -jar myjar.jar jar 时,它 运行 如预期的那样没有抛出异常

我在 linux/windows 下都有同样的问题我真的不明白这一点,因为我使用相同的方式创建的其他 jar 文件 运行 没有任何问题。

Just for fun I created a c program containing only

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

When I double clicked the compiled c program my jar opened up !

这是清单

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 起作用,然后它挂在那里,另一个 Windows 应该在那之后启动出现,请告诉我在哪里看...为什么它不起作用?因为看起来我的 Classes 扩展 JFram 需要 terminal/cmd 出现,我还应该注意我正在使用一个名为 R 的 class 来加载来自文本文件的字符串取决于语言和 Cfg Class 检查程序是否首次启动或之前启动过,然后加载正确的语言文件和资源。

编辑
正如答案中所建议的那样,我删除了所有 JDK 并安装了 Oracle 的 JDk 仍然存在相同的问题

问题可能出在 Java SE 运行时环境安装不当。可能需要从您的计算机上卸载 Java 的所有痕迹,然后使用来自 Oracle Technology Network.

的离线安装程序重新安装 Java

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

我解决了我自己的问题是为什么: 正如我在细节中所说,我使用 JAR 文件外部的文本资源,并且我使用硬代码来获取这些资源,例如 final File("lang/en.prop"); 事情是从 GUI 启动时用 JAVA SE ,它就像 运行 从其他目录向我的 jar 发出的命令会失败,因为 Cfg class 会抛出 NullPointerException 因为文本资源不存在所以我做了一个新的 Class 像这样叫它 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("/"));
    }

现在在 Launch 上,我将首先找到我在文件系统上的位置,然后根据我当前的位置为我的程序设置所需文件的值,现在双击非常有用!简单