2010-04-23 104 views
20

我想要做的是从groovy脚本调用maven。有问题的groovy脚本被用作Maven包装来构建J2EE项目,方法是下载标签并调用下载的Maven。我应该如何完成调用maven来构建/打包EAR(groovy脚本已经能够从SCM下载标签)。如何在Java/Groovy中进行系统命令调用?

回答

31

在Groovy中调用外部进程的最简单方法是对字符串使用execute()命令。例如,从Groovy脚本执行的Maven运行:如果你想捕捉的命令的输出

"cmd /c mvn".execute() 

,也许把它打印出来,你可以这样做:

print "cmd /c mvn".execute().text 

的“ cmd/c'在开始时调用Windows命令shell。由于mvn.bat是一个批处理脚本,你需要这个。对于Unix,你可以调用系统shell。

+0

酷!不知道你能做到这一点。 – armandino 2010-04-27 05:46:02

+0

这对我来说是第一次。去掉了一段时间的流程“consumeProcessOutput()”路线,但没有骰子。 这将有助于确定Docker构建失败的原因。 – eversMcc 2017-03-01 11:58:21

4

对于Java 7+标准输入输出重定向:

new ProcessBuilder('cmd', …args…).redirectOutput(ProcessBuilder.Redirect.INHERIT).start().waitFor(); 
+0

如果你传入一个args的'List',确保这些元素都是'String's而不是[GString](http://docs.groovy-lang.org/docs/latest/html/api/groovy/ lang/GString.html)与插值变量。另外,不要忘记'redirectError'。 – seanf 2017-11-23 01:35:12

18

如果你想在标准输出上执行的命令,你可以做

获取打印输出是因为这样做

"yourCommand".execute(); 

一样简单

def proc = "yourCommand".execute(); 
proc.waitForProcessOutput(System.out, System.err); 

如果你想存储和处理输出,你可以做

def proc = "yourCommand".execute(); 
def outputStream = new StringBuffer(); 
proc.waitForProcessOutput(outputStream, System.err); 
println(outputStream .toString()); 
+1

当我这样做def homeDir =“c:/ test/server”; def workDir =“$ {homeDir}/workDir”; def tempDir =“$ {workDir}/tmp”; println(homeDir); println(workDir); runShell(“cd c:”); // runShell(“mkdir -p $ {tempDir}”); void runShell(String s){ def execute = s.execute(); execute.waitForProcessOutput(System.out,System.err); def value = execute.exitValue(); if(val> 0){ throw new Exception(“Exit value:$ {value}”); } } 我收到如下错误:java.io.IOException:无法运行程序“cd”:CreateProcess error = 2,系统找不到指定的文件 – user641887 2016-11-01 23:27:11