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
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.
È possibile utilizzare la classe di runtime per avviare un comando di shell. dai un'occhiata qui: http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String) Puoi in seguito catturare i risultati dell'esecuzione del processo (per scoprire se è fallito o meno).
per Java 7+ stdio reindirizzamento:
new ProcessBuilder('cmd', …args…).redirectOutput(ProcessBuilder.Redirect.INHERIT).start().waitFor();
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
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());
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
Cool! Non sapevo che puoi farlo. – armandino
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