【发布时间】:2016-03-26 08:23:15
【问题描述】:
我正在使用 Runtime.getRuntime().exec 函数为子程序任务启动独立的 GUI Java 应用程序。
使用的代码很简单:
Runtime.getRuntime().exec("java -jar /home/user/jar.jar");
执行代码不会导致任何进程启动,也不会发生错误! ProcessBuilder 具有相同的效果。 已检查可在 Windows 上正常运行。 看起来,在某些平台上,它在 Java 之外的系统级别上会被忽略,因为 JRE 不会返回任何类型的错误。
EDT:我编辑了代码以通过并行线程读取 stderr 和 stdout 以保留主应用程序执行:
Process p = Runtime.getRuntime().exec(runCmd);
new DaemonFailPrint(p).start();
线程代码是:
public class DaemonFailPrint extends Thread {
private Process process;
public DaemonFailPrint(Process process) {
this.process = process;
}
@Override
public void run() {
try {
process.waitFor();
String out = "";
while (process.getInputStream().available() > 0) {
out += (char) process.getInputStream().read();
}
out += System.lineSeparator();
while (process.getInputStream().available() > 0) {
out += (char) process.getErrorStream().read();
}
JOptionPane.showMessageDialog(null, out);
} catch (InterruptedException | IOException ex) {
JOptionPane.showMessageDialog(null, ex);
}
}
}
结果是:子进程“启动”后我立即得到空消息框。
意思是Process对象似乎是同时创建和完成的,但不存在错误。
【问题讨论】:
-
写出好问题需要练习和努力。请浏览tour 并查看help center 部分以及how to ask good questions 部分,希望您未来的问题会更好。
-
你怎么知道没有启动或没有发生错误?您在哪里向我们展示了如何处理 Process 的 InputStream 或其错误流?如果没有这些,您将不知道进程是否将任何输出传递到其标准输出或标准错误。
-
顺便说一句。您是在 OpenSuse 上使用“真正的”Oracle Java(由于许可证问题需要手动安装)还是随 OpenSuse - OpenJDK 一起分发的 Java 机器? OpenJDK 是一种替代实现,在某些情况下可能表现不同(我过去已经遇到过 OpenJDK 的一些不兼容问题)。
-
不。我知道使用 OpenJDK 会造成人员伤亡。我运行手动安装的官方 Oracle 发行版和最新更新。
标签: java runtime subprocess