2010-04-23 102 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