我正在使用 Java 自动化 gradle 构建。我在从 ProcessBuilder 创建的进程中执行“gradlew.bat”。代码如下:
ProcessBuilder gradlewProcessBuilder = new ProcessBuilder(mainDirPath.concat("\\android\\gradlew.bat"), "assembleDebug");
gradlewProcessBuilder.directory(new File(mainDirPath.concat("/android")));
gradlewProcessBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); //This is the line
Process gradlewProcess = gradlewProcessBuilder.start();
gradlewProcess.waitFor();
现在这段代码可以完美运行,但它通过应用程序控制台输出 gradle 控制台,我不希望这样。如果我删除这一行:
gradlewProcessBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
进程无限期地卡在 waitFor() 中。
我完全不知道redirectOutput如何对此产生影响,欢迎您提供任何信息。
最佳答案
如果输出未重定向或处理,则分配默认输出缓冲区。然而,在 Windows 上,输出缓冲区非常小;当它填满时,应用程序将停止执行并阻塞,直到输出缓冲区耗尽。
因此,您需要以某种方式耗尽输出;通过使用 INHERIT 或通过使用耗尽输出的线程。我建议使用https://github.com/zeroturnaround/zt-exec因为它有更好的默认处理。
关于java - ProcessBuilder:如果没有 "redirectOutput",进程就无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53215216/