我正在使用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对象似乎同时创建和完成,但不存在错误输出。
答案 0 :(得分:0)
Runtime :: exec()不会等待进程退出,因此如果要检测已执行程序本身的错误,则需要使用以下内容:
Process process = Runtime.getRuntime().exec("java -jar /home/user/jar.jar");
int rc = process.waitFor();
if (rc != 0)
{
System.err.println("The process failed with error: " + rc);
}
可能是,找不到或无法执行jar等等,通常在控制台上看到的那些错误,但如果你没有控制台,唯一的线索可能就是返回代码。
您可能还想在此处查看如何捕获输出控制台: Capturing stdout when calling Runtime.exec
似乎您可以使用process.getInputStream()
连接到流程的输出流。因此,您只需将其复制到控制台即可查看发生的情况。
答案 1 :(得分:0)
到目前为止一切顺利!我最近自己找到了答案,但仍然没有理由以这种方式工作,但我想这都是关于在不同平台上处理VM的新进程的内部差异。 我必须以这种方式编辑代码,现在它可以工作:
String[] runcmd = {"java","-jar","/home/user/jar.jar"};
Runtime.getRuntime().exec(runcmd);
现在它看起来很完美。正如我所看到的那样,它无法处理文件并执行命令,参数给定为相同的字符串而Java代码级别没有抛出错误,它可能在VM内部丢失。