Command line 如何在Java/Groovy中进行系统命令调用?

Command line 如何在Java/Groovy中进行系统命令调用?,command-line,groovy,build-automation,Command Line,Groovy,Build Automation,我想做的是从groovy脚本调用maven。所讨论的groovy脚本被用作maven包装器,通过下载标记并对下载的内容调用maven来构建J2EE项目。如何调用maven来构建/打包EAR(groovy脚本已经能够从SCM下载标记)。您可以使用Runtime类来启动shell命令。请看这里: 稍后您可能会捕获进程执行的结果(以确定它是否失败)。在Groovy中调用外部进程的最简单方法是对字符串使用execute()命令。例如,要从groovy脚本执行maven,请运行以下命令: "cmd /c

我想做的是从groovy脚本调用maven。所讨论的groovy脚本被用作maven包装器,通过下载标记并对下载的内容调用maven来构建J2EE项目。如何调用maven来构建/打包EAR(groovy脚本已经能够从SCM下载标记)。

您可以使用Runtime类来启动shell命令。请看这里:
稍后您可能会捕获进程执行的结果(以确定它是否失败)。

在Groovy中调用外部进程的最简单方法是对字符串使用execute()命令。例如,要从groovy脚本执行maven,请运行以下命令:

"cmd /c mvn".execute()
如果您希望捕获命令的输出并可能将其打印出来,可以执行以下操作:

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

开始处的“cmd/c”调用Windows命令shell。因为mvn.bat是一个批处理脚本,所以您需要它。对于Unix,您可以调用系统shell。

对于Java 7+stdio重定向:

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

这很简单

"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());
如果要存储和处理输出,可以执行以下操作

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());
更新:

您还可以通过设置工作目录

File workingDir = file("<path to dir>")
def proc = "yourCommand".execute([], workingDir.absolutePath);
File workingDir=File(“”)
def proc=“yourCommand”。执行([],workingDir.absolutePath);

酷!我不知道你能做到这对我来说是第一次。在进程“consumeProcessOutput()”路线上运行了一段时间,但对此毫无把握。这将大大有助于确定Docker构建失败的原因;def workDir=“${homeDir}/workDir”;def tempDir=“${workDir}/tmp”;println(homeDir);println(workDir);runShell(“cd c:”)//runShell(“mkdir-p${tempDir}”);void runShell(字符串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,系统找不到指定的文件如果传入参数的
列表
,请确保元素都是
字符串
s,而不是带有插值变量的s。也不要忘记重定向错误。