2010-04-23 29 views
20

Lo que quiero hacer es invocar a maven desde un script maravilloso. El guión groovy en cuestión se usa como envoltorio de maven para crear proyectos J2EE al descargar una etiqueta e invocar a maven en lo que se descargó. ¿Cómo debo lograr invocar a maven para construir/empaquetar el EAR (el script groovy ya es capaz de descargar la etiqueta de SCM).¿Cómo hacer llamadas de comandos del sistema en Java/Groovy?

Respuesta

31

La forma más sencilla de invocar un proceso externo en Groovy es utilizar el comando execute() en una cadena. Por ejemplo, para ejecutar experta de un guión maravilloso ejecutar esto:

"cmd /c mvn".execute() 

Si desea capturar la salida del comando y tal vez imprimirlo, usted puede hacer esto:

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

El ' cmd/c 'al inicio invoca el shell de comandos de Windows. Como mvn.bat es un script por lotes, necesita esto. Para Unix, puede invocar el shell del sistema.

+0

¡Genial! No sabía que puedes hacer eso. – armandino

+0

Esto funcionó por primera vez para mí. Bajé por la ruta Proceso "consumeProcessOutput()" por un tiempo pero no tuve ningún dado con eso. Esto ayudará enormemente a determinar los motivos de la compilación de Docker. – eversMcc

4

para Java 7+ stdio redirección:

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

Si pasa una 'Lista' de argumentos, asegúrese de que los elementos sean todos' String's y no [GString] (http://docs.groovy-lang.org/docs/latest/html/api/groovy/ lang/GString.html) s con variables interpoladas. Tampoco olvides 'redirectError' también. – seanf

18

es tan simple como hacer

"yourCommand".execute(); 

Si desea obtener resultados de impresión en el comando ejecutado en la salida estándar que puede hacer

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

Si desea almacenar y procesar la salida, puede hacer

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

cuando hago esto def homeDir = "c:/test/server"; def workDir = "$ {homeDir}/workDir"; def tempDir = "$ {workDir}/tmp"; println (homeDir); println (directorio de trabajo); 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 ("Valor de salida: $ {value}"); } } Aparece un error como el siguiente java.io.IOException: No se puede ejecutar el programa "cd": CreateProcess error = 2, El sistema no puede encontrar el archivo especificado – user641887

Cuestiones relacionadas