2010-04-23 7 views
20

Ce que je veux faire est d'appeler maven à partir d'un script groovy. Le script groovy en question est utilisé comme un wrapper maven pour construire des projets J2EE en téléchargeant une balise et en invoquant maven sur ce qui a été téléchargé. Comment dois-je accomplir en invoquant maven pour construire/empaqueter le fichier EAR (le script groovy est déjà capable de télécharger le tag depuis SCM).Comment faire des appels de commande système dans Java/Groovy?

Répondre

31

La méthode la plus simple pour appeler un processus externe dans Groovy consiste à utiliser la commande execute() sur une chaîne. Par exemple, pour exécuter Maven à partir d'un script groovy exécuté ceci:

"cmd /c mvn".execute() 

Si vous voulez capturer la sortie de la commande et peut-être l'imprimer, vous pouvez le faire:

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

Le ' cmd/c 'au début appelle le shell de commande Windows. Puisque mvn.bat est un script batch, vous en avez besoin. Pour Unix, vous pouvez appeler le shell système.

+0

Cool! Je ne savais pas que vous pouvez le faire. – armandino

+0

Cela a fonctionné la première fois pour moi. Je suis descendu le processus "consumeProcessOutput()" route pendant un moment, mais n'avait pas de dés avec cela. Cela aidera grandement à déterminer les raisons de l'échec de la construction de Docker. – eversMcc

4

Pour la redirection de Java 7+:

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

Si vous passez une 'List' d'args, assurez-vous que les éléments sont tous' String's et non [GString] (http://docs.groovy-lang.org/docs/latest/html/api/groovy/ lang/GString.html) s avec des variables interpolées. N'oublie pas non plus de redirectError. – seanf

18

Il est aussi simple que de faire

"yourCommand".execute(); 

Si vous souhaitez obtenir des sorties d'impression sur la commande exécutée sur la sortie standard que vous pouvez faire

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

Si vous souhaitez stocker et traiter la sortie, vous pouvez le faire

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

lorsque je fais ceci 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 (Chaînes) { def execute = s.execute(); execute.waitForProcessOutput (System.out, System.err); def valeur = execute.exitValue(); if (val> 0) { throw nouvelle Exception ("Valeur de sortie: $ {value}"); } } Je reçois une erreur comme ci-dessous java.io.IOException: Impossible d'exécuter le programme "cd": Erreur CreateProcess = 2, Le système ne peut pas trouver le fichier spécifié – user641887

Questions connexes