不能在 Opensuse 上 运行 Java Runtime.exec()

Cannot run Java Runtime.exec() on Opensuse

我正在使用 Runtime.getRuntime().exec 函数启动独立的 GUI Java 子程序任务应用程序。

使用的代码比较简单:

Runtime.getRuntime().exec("java -jar /home/user/jar.jar");

执行代码不会导致任何进程启动,也不会发生错误! ProcessBuilder 具有相同的效果。 已检查以在 Windows 上正常工作。 看起来,在某些平台上,它在 Java 之外的系统级别被忽略,因为 JRE 不会 return 任何类型的错误。

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);
        }

    }

}

结果是:在子进程 "launched".

之后我直接得到空的消息框

意思是 Process 对象似乎同时创建和完成,但不存在错误。

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 或无法执行等,您通常会在控制台上看到这些错误,但如果您没有控制台,唯一的线索可能是 return 代码.

您可能还想在此处查看如何捕获输出控制台: Capturing stdout when calling Runtime.exec

似乎可以使用 process.getInputStream() 连接到进程的输出流。所以你可以简单地把它复制到控制台看看发生了什么。

到目前为止一切顺利!我最近自己找到了答案,仍然不知道为什么它会这样工作,但我想这完全是关于在不同平台上处理 VM 中的新进程的内部差异。 我不得不以这种方式编辑代码,现在它可以工作了:

String[] runcmd = {"java","-jar","/home/user/jar.jar"};
Runtime.getRuntime().exec(runcmd);

现在看来效果很好。正如我所看到的那样,它无法处理文件并使用作为相同字符串给定的参数执行命令,而在 Java 代码级别没有抛出错误,它可能在 VM 内部丢失。