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

时间:2017-10-02 02:28:30

标签: java client

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

最近我收到了一些用户的报告,这些用户的启动器已经打开并运行良好。但是,在执行启动客户端应用程序的命令时,没有任何反应。现在我猜这与某些桌面环境中的某种安全设置有关,问题似乎不是平台或JDK特定的。启动器和客户端都使用JDK8。但是,当我读到Oracle强迫所有用户将其JDK更新为8时,我看不出这有多重要。

以下是完整课程的链接:

https://pastebin.com/fF21d4vu

以下是运行外部客户端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();
        }
    }

有没有人知道可能会出现什么问题,或者我应采取什么方法来解决这个问题?我很想知道一种通用的,独立于平台的方法来确保代码的执行。

提前致谢,

斯坦

1 个答案:

答案 0 :(得分:1)

你做错了。

  1. 您丢弃了Process
  2. 返回的exec
  3. 您没有检查其返回码
  4. 您不是在等待它完成。 (sleep(1000)黑客不会削减它!)
  5. 您没有检查可能向其报告错误的标准输出/错误流。
  6. 阅读Process的javadocs以了解如何执行上述操作。

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

    • 您依靠exec(String)将命令行拆分为参数。如果任何参数包含空格,则会失败。 (并且引用或转义无法帮助!!)使用exec(String[])重载并自行拆分参数。

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

    • 可能是JAR文件的路径不正确
    • 可能是您的参数不正确
    • JAR可能不是正确形成的可执行 JAR文件
    • JAR中的程序可能只是错误的

    请注意,如果您在开头正确时执行操作,则应该有证据来帮助您了解实际问题。

      

    我很想知道一种通用的,与平台无关的方法来确保代码的执行。

    不是我们所有人。不幸的是,没有一个。即使您纠正了上述所有可能存在的问题/错误,仍然存在无法工作的情况。例如,如果Java沙箱或操作系统不允许您运行java。 (想想...... AppArmor,或SE Linux in"强制执行"模式。)