无法在Opensuse上运行Java Runtime.exec()

时间:2015-12-19 21:45:21

标签: java runtime subprocess

我正在使用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对象似乎同时创建和完成,但不存在错误输出。

2 个答案:

答案 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内部丢失。