6

我正在通过以下方式启动一个过程。

try {
    final Process mvnProcess = new ProcessBuilder("cmd", "/c", "mvn", "--version")
            .directory(new File(System.getProperty("user.dir")))
            .inheritIO()
            .start();
    System.exit(mvnProcess.waitFor());
} catch (final IOException ex) {
    System.err.format(IO_EXCEPTION);
    System.exit(1);
} catch (final InterruptedException ex) {
    System.err.format(INTERRUPTED_EXCEPTION);
    System.exit(1);
}

由于我调用inheritIO()我期待子进程在控制台上的输出,但没有出现。我在这里想念什么?

编辑:我知道我可以mvnProcess.getInputStream()显式地使用和读取进程的输出,并在循环中将其写入控制台(或任何地方)。但是我不喜欢这个解决方案,因为循环会阻塞我的线程。inheritIO()看起来很有希望,但显然我不明白它是如何工作的。我希望这里有人可以对此有所了解。

4

2 回答 2

2

也许从子进程中读取它是一个选项:

之后添加此代码start(),您将把它打印到标准输出:

    InputStream is = mvnProcess.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ((line = br.readLine()) != null)
    {
        System.out.println(line);
    }
于 2013-07-08T11:57:10.670 回答
1

您可以使用 .redirectError(Redirect.INHERIT)。它将子进程标准 I/O 的源和目标设置为与当前 Java 进程的相同。

于 2017-01-25T06:22:45.573 回答