Java Runtime.getRuntime().exec()不执行外部客户端jar

Java Runtime.getRuntime().exec()不执行外部客户端jar,java,client,Java,Client,所以基本上我拥有一个在线游戏,玩家可以通过使用Java编写的客户端应用程序来连接。我编写了一个启动器应用程序(也是用Java编写的),它有一个自动更新系统,因此我们的用户不必在每次更新后手动重新下载客户端 最近我收到了一些用户的报告,他们的启动器已经打开并且运行良好。但是,在执行启动客户机应用程序的命令时,什么也没有发生。现在我猜这与某些桌面环境中的某种安全设置有关,问题似乎与平台或JDK无关。启动器和客户端都使用JDK8。然而,我不认为这有什么关系,因为我在某处读到Oracle强迫所有用户将J

所以基本上我拥有一个在线游戏,玩家可以通过使用Java编写的客户端应用程序来连接。我编写了一个启动器应用程序(也是用Java编写的),它有一个自动更新系统,因此我们的用户不必在每次更新后手动重新下载客户端

最近我收到了一些用户的报告,他们的启动器已经打开并且运行良好。但是,在执行启动客户机应用程序的命令时,什么也没有发生。现在我猜这与某些桌面环境中的某种安全设置有关,问题似乎与平台或JDK无关。启动器和客户端都使用JDK8。然而,我不认为这有什么关系,因为我在某处读到Oracle强迫所有用户将JDK更新为8

以下是指向完整类的链接:

以下是运行外部客户端jar的特定代码:

private static void startApplication() {
        try {
            Runtime.getRuntime().exec("java -jar "+(findCacheDir() + "client.jar")+" "+ARGS[0]);
            Thread.sleep(1000);
            System.exit(0);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
有没有人知道什么地方可能出错,或者我应该采取什么方法来解决这个问题?我很想知道一种通用的、独立于平台的方式来确保代码的执行

提前感谢,


斯坦

你做错了几件事

  • 您正在丢弃由
    exec返回的
    进程
  • 您没有检查其返回代码
  • 你不是在等待它完成。(
    sleep(1000)
    hack不会切断它!)
  • 您没有检查可能向其报告错误的标准输出/错误流
  • 阅读
    过程的javadocs以了解如何执行上述操作

    实际问题可能是以下一个或多个问题:

    • 您依靠
      exec(String)
      将命令行拆分为参数。如果任何参数包含空格,则该操作将失败。(引用或转义也没用!!)使用
      exec(String[])
      重载并自己分割参数

    • %PATH%
      /
      $PATH
      环境变量可能有问题,这意味着操作系统无法找到
      java
      命令

    • 可能是JAR文件的路径不正确
    • 可能是你的论点不正确
    • JAR可能不是格式正确的可执行JAR文件
    • JAR中的程序可能有缺陷
    请注意,如果您在开始时正确地执行了操作,那么应该有证据来帮助您了解实际问题是什么


    我很想知道一种通用的、独立于平台的方式来确保代码的执行


    难道我们都不会。不幸的是,没有。即使您纠正了上述所有可能出现的问题/错误,但在某些情况下它仍然无法工作。例如,如果Java沙箱或操作系统不允许您运行
    Java
    。(想想……AppArmor,或处于“强制”模式的SE Linux。)

    当您忽略返回值,不记录退出代码或使用进程输出时,除了完全困惑之外,您还期待什么呢?@EJP嗯,我并不是真的期待什么,我找不到多少关于如何继续的指导(虽然我确信这是因为我缺乏更深层次的理解。)如果我的问题提出得不好,我很抱歉,我只是想知道是否有人知道一些预先确定的方法来实现普遍解决方案。