2009-12-18 47 views
6

Bueno, parece una tarea simple, pero no logré que funcione.¿Cómo ejecutar un Groovy Script desde mi aplicación Grails?

que tienen un guión maravilloso que funciona muy bien con Windows Vista cuando se llama desde el indicador:

> cd MY_GAILS_PROJECT_DIR 
> groovy cp src/groovy scripts/myscript.groovy 

Ahora, yo quiero para ejecutar esta secuencia de comandos (y pasando a ella algunos argumentos de entrada) a través de mi mi clase de servicio de mantenimiento (llamado desde un controlador) de la siguiente manera,

class MaintenanceService { 
    def executeMyScript() { 
    "groovy cp src/groovy scripts/myscript.groovy".execute() 
    } 
} 

¡No funciona para nada! Ni siquiera logran tener el método execute() el reconocimiento de cualquier comando (como "cd .".execute()) lanzar una excepción:

Error 500: java.io.IOException: Cannot run program "cd": CreateProcess error=2, The system cannot find the file specified 

1- ¿Cómo puedo ejecutar un script maravilloso de mi solicitud para griales?

2- ¿Cuáles son las mejores prácticas aquí? Por ejemplo, ¿debería usar QuartzPlugin y luego el método triggerNow para ejecutar un script? ¿Debería usar una tarea Gant? Si es así, ¿cómo hacerlo?

Gracias.

+0

¿Hay alguna razón específica por la cual tiene que ser un "guión" maravilloso, en lugar de una clase a la que se puede llamar, como sugiere Bastianneu a continuación? – Ash

+0

Sí. Necesito que este guión maravilloso también se ejecute sin el entorno de Grails. – fabien7474

Respuesta

5

Si no te importa la secuencia de comandos se ejecuta de forma asíncrona (en un proceso separado para el método de servicio), lo siguiente debe funcionar asumiendo groovy está en la variable PATH:

def cmd = ['groovy.bat', 'cp', 'src/groovy scripts/myscript.groovy'] 
cmd.execute() 

Si desea ver el resultado del proceso en la consola de aplicación, debe intentar algo como esto en su lugar

// Helper class for redirecting output of process 
class StreamPrinter extends Thread { 
    InputStream inputStream 

    StreamPrinter(InputStream is) { 
     this.inputStream = is 
    } 

    public void run() { 
     new BufferedReader(new InputStreamReader(inputStream)).withReader {reader -> 
      String line 
      while ((line = reader.readLine()) != null) { 
       println(line) 
      } 
     } 
    } 
} 

// Execute the script 
def cmd = ['groovy', 'cp', 'src/groovy scripts/myscript.groovy'] 
Process executingProcess = cmd.execute() 

// Read process output and print on console 
def errorStreamPrinter = new StreamPrinter(executingProcess.err) 
def outputStreamPrinter = new StreamPrinter(executingProcess.in) 
[errorStreamPrinter, outputStreamPrinter]*.start() 

Actualización: En respuesta a su comentario a continuación, pruebe lo siguiente (que asume que está en Windows):

1: Crear el archivo C: \ tmp \ foo.groovy. El contenido de este archivo debe ser simplemente:

println 'it works!' 

2: En la consola maravilloso, ejecute el siguiente:

cmd = ['groovy.bat', 'C:\\tmp\\foo.groovy'] 
cmd.execute().text 

3: Usted debe ver el resultado de la secuencia de comandos (el texto 'que funciona ! ') que se muestra en la consola Groovy

Si no puede obtener este sencillo ejemplo funcionando, hay algo mal con su entorno, por ejemplo 'groovy.bat' no está en su RUTA. Si puede hacer que este ejemplo funcione, entonces debería poder avanzar para alcanzar su objetivo.

+0

Hola. gracias por su respuesta pero arroja exactamente el mismo resultado. Por ejemplo, def cmd = ['cd', 'd:/temp']; cmd.execute() => El sistema no puede encontrar el archivo especificado. ¿Tiene una idea? – fabien7474

+0

¡Muchas gracias! Detrás de su ejemplo, logré que funcione con barras diagonales inversas para path y "groovy.bat" en lugar de groovy. ¡Y ahora funciona! Gracias. Una pregunta: ¿sabes por qué funciona 'groovy.bat' pero no 'groovy' (mientras que en un símbolo del sistema ambos funcionan)? – fabien7474

+0

Supongo que es porque en un símbolo del sistema '.bat' se reconoce como un tipo de archivo ejecutable, pero en el nivel del sistema operativo debe proporcionar el nombre de archivo completo a menos que sea '.exe'. A propósito, en Linux puedes usar 'grails' o 'grails.sh' –

2

manera más fácil:

Generación de una clase maravillosa y el lugar en el en/src/Carpeta maravilloso de su proyecto Grails. Importe esa clase en su clase de dominio y use las funciones que definió.

mis 2 centavos ...

4

A partir de griales 1.3.6 run-script el comando está integrado en le permite ejecutar

grails run-script myScript.groovy 

Para versiones anteriores de grails, check out my updated blog post de lo que Carlos publicó anteriormente.

Cuestiones relacionadas