【问题标题】:Maven exec with ProcessBuilder stops processing带有 ProcessBuilder 的 Maven exec 停止处理
【发布时间】:2020-03-24 14:07:01
【问题描述】:

我正在运行我的代码;

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.redirectErrorProcessBuilder.redirectOutput 应该被使用,然后你可以从中读取......
  • @khmarbaise 好的,我添加了它们,它们现在正在工作。但我真的不明白为什么日志记录解决了我的问题?我不想用它。因为我已经在使用 apache 记录器了。

标签: java windows maven cmd processbuilder


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2014-01-04
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多