带有ProcessBuilder的Maven exec停止处理



我正在以;

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>

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

正如khmarbaise提到的"应该使用ProcessBuilder.redirectError和ProcessBuilder.redirectOutput,然后您可以从中读取…",解决方案是添加重定向。

最新更新