我需要编写一个groovy脚本,即执行外部程序并将该程序的输出打印到控制台。
以下是相关代码段:
def pmdCommand = "${scriptDir}/run.sh pmd -d ${filesToAnalyse}"
def sout = new StringBuffer()
def serr = new StringBuffer()
def process = pmdCommand.execute()
process.consumeProcessOutput(sout, serr)
process.waitFor()
if (process.exitValue() !=0 ) {
System.err << serr.toString()
System.exit(-1)
}
else {
System.out << sout.toString()
System.exit(0)
}
我在Java中做过类似的事情,但我无法将其转换为groovy。
StringBuffer output = new StringBuffer();
String s = null;
try {
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
while ((s = stdError.readLine()) != null) {
System.err.println(s);
}
System.exit(0);
}
catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
更新:我似乎waitFor()永远不会返回并阻止执行
Emmanuel Rosa提供的解决方案:
def pmdCommand = "/usr/src/app/lib/pmd/bin/run.sh pmd -d ${filesToAnalyse} -f codeclimate -R ${ruleset} -l apex -v 35"
def sout = new StringBuffer()
def serr = new StringBuffer()
def process = pmdCommand.execute()
process.consumeProcessOutput(sout, serr)
process.waitForProcessOutput()
System.out << sout.toString()
System.exit(0)
答案 0 :(得分:3)
documentation表示consumeProcessOutput()
...
从进程获取输出和错误流并将其读取到 由于完整的输出缓冲区,使进程不会阻塞。该 已处理的流数据将附加到提供的OutputStream。对于 这样,两个线程就会启动,所以这个方法会立即返回。
到目前为止一切顺利。这是重要的部分......
即使调用waitFor(),线程也不会是join()ed。
解决方案......
等待 要使输出完全消耗,请调用waitForProcessOutput()。
所以你可以做的是用process.waitFor()
替换process.waitForProcessOutput()
。