带有 ProcessBuilder 的 Maven exec 停止处理

Maven exec with ProcessBuilder stops processing

我运行将我的代码设置为;

mvn exec:java@xxxxxxxxxxxx -Dexec.args="hello"

我不知道为什么,但它以某种方式停止处理。它在 10 或 20 秒后卡住。但这发生在 ProcessBuilder 上;

我是这样运行的:

public static long runCommandLine(String commandLineArgs){
        try {
            ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", commandLineArgs);
            Process process = pb.start();
            if(!commandLineArgs.contains("runner")) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                while ((reader.readLine()) != null) { /*haha*/}
                process.waitFor();
            }
            return process.pid();
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

我将 .bat 文件的路径作为参数 (String commandLineArgs) 发送到该方法;

.bat 文件包含行:

cd C:/xxxx/%username%/xxx
mvn exec:java@xxxxxxxxxxxx -Dexec.args="hello"

如果我手动 运行 .bat 文件,一切正常。但是使用 ProcessBuilder 会在一段时间后卡住。

pom.xml 配置:

<plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.6.0</version>
                    <executions>
                        <execution>
                            <id>xxxxxxxx</id>
                            <configuration>
                                <mainClass>xxxxxxxxxxx</mainClass>
                            </configuration>
                        </execution>
                   </executions>
</plugin>

如 khmarbaise 所述"ProcessBuilder.redirectError and ProcessBuilder.redirectOutput should be used and afterwards you can read from it...",解决方案是添加重定向。

进程在 ProcessBuilder.start() 之后明显暂停一段时间的原因通常与您的应用程序在生成时未使用 stdout 和 stderr 流有关。因此,如果没有按照建议调用 redirectError/redirectOutput(File),只需设置一个 Runnable/Thread 来同时使用 getInputStream / getErrorStream.