所以基本上我拥有一个玩家可以通过使用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();
}
}
有没有人知道可能会出现什么问题,或者我应采取什么方法来解决这个问题?我很想知道一种通用的,独立于平台的方法来确保代码的执行。
提前致谢,
斯坦
答案 0 :(得分:1)
你做错了。
Process
exec
sleep(1000)
黑客不会削减它!)阅读Process
的javadocs以了解如何执行上述操作。
实际问题可能是以下一项或多项:
您依靠exec(String)
将命令行拆分为参数。如果任何参数包含空格,则会失败。 (并且引用或转义无法帮助!!)使用exec(String[])
重载并自行拆分参数。
%PATH%
/ $PATH
环境变量可能存在问题,这意味着操作系统无法找到java
命令。
请注意,如果您在开头正确时执行操作,则应该有证据来帮助您了解实际问题。
我很想知道一种通用的,与平台无关的方法来确保代码的执行。
不是我们所有人。不幸的是,没有一个。即使您纠正了上述所有可能存在的问题/错误,仍然存在无法工作的情况。例如,如果Java沙箱或操作系统不允许您运行java
。 (想想...... AppArmor,或SE Linux in"强制执行"模式。)