2010-04-23 18 views
20

Quello che voglio fare è invocare Maven da uno script groovy. Lo script groovy in questione viene utilizzato come un wrapper maven per creare progetti J2EE scaricando un tag e invocando il maven su ciò che è stato scaricato. Come dovrei realizzare invocando maven per compilare/pacchettizzare l'EAR (lo script groovy è già in grado di scaricare il tag da SCM).Come effettuare chiamate di comando di sistema in Java/Groovy?

risposta

31

Il modo più semplice per richiamare un processo esterno in Groovy è utilizzare il comando execute() su una stringa. Ad esempio, per eseguire Maven da uno script Groovy eseguire questo:

"cmd /c mvn".execute() 

Se si desidera catturare l'output del comando e magari stamparlo, si può fare questo:

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

Il ' cmd/c 'all'inizio richiama la shell dei comandi di Windows. Poiché mvn.bat è uno script batch, ti serve questo. Per Unix puoi invocare la shell di sistema.

+0

Cool! Non sapevo che puoi farlo. – armandino

+0

Questo ha funzionato per la prima volta. È andato giù per il processo "consumeProcessOutput()" per un po 'ma non ha avuto dadi con quello. Questo aiuterà notevolmente a determinare i motivi per cui la build di Docker fallisce. – eversMcc

4

per Java 7+ stdio reindirizzamento:

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

Se passi in un 'List' di args, assicurati che gli elementi siano tutti' String's e non [GString] (http://docs.groovy-lang.org/docs/latest/html/api/groovy/ lang/GString.html) s con variabili interpolate. Inoltre, non dimenticare di 'redirectError'. – seanf

18

E 'semplice come fare

"yourCommand".execute(); 

Se si desidera ottenere risultati di stampa sul comando eseguito sullo standard output che si può fare

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

Se si desidera archiviare ed elaborare l'output, è possibile eseguire

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

quando faccio questo 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}"); } } Ottengo un errore come sotto java.io.IOException: Impossibile eseguire il programma "cd": Errore di CreateProcess = 2, Il sistema non riesce a trovare il file specificato – user641887

Problemi correlati