2009-12-18 15 views
6

Beh, sembra un compito semplice ma non sono riuscito a farlo funzionare.Come eseguire un Groovy Script dalla mia app Grails?

Ho uno script Groovy che funziona bene con Windows Vista quando si chiama messaggio:

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

Ora, voglio eseguire questo script (e passando ad esso alcuni argomenti di input) attraverso il mio il mio Maintenance Service Class (chiamato da un controller) come sotto,

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

Non funziona affatto! Non ho nemmeno riescono ad avere il metodo execute() riconoscere qualsiasi comando (come "cd .".execute()) eccezione lancio:

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

1- Come posso eseguire uno script Groovy dalla mia applicazione graal?

2- Quali sono le migliori pratiche qui? Ad esempio, dovrei usare QuartzPlugin e poi il metodo triggerNow per l'esecuzione di uno script? dovrei usare un compito di Gant? Se sì, come si fa?

Grazie.

+0

C'è una ragione specifica che deve essere uno "script" groovy, piuttosto che una classe che puoi chiamare, come suggerito da bastianneu qui sotto? – Ash

+0

Sì. Ho bisogno che questo script groovy venga eseguito anche senza l'ambiente Grails. – fabien7474

risposta

5

Se non ti dispiace lo script in esecuzione in modo asincrono (in un processo separato per il metodo di servizio), il seguente dovrebbe funzionare assumendo groovy è sulla vostra variabile PATH:

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

Se si desidera visualizzare l'output del processo nella console di applicazione, si dovrebbe provare qualcosa di simile, invece

// 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() 

Aggiornamento: In risposta al tuo commento qui sotto, provare quanto segue (che presuppone siete su Windows):

1: Creare il file C: \ tmp \ foo.groovy. Il contenuto di questo file dovrebbe essere semplicemente:

println 'it works!' 

2: Nella console Groovy, eseguire il seguente:

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

3: Si dovrebbe vedere il risultato dello script (il testo 'funziona ! ') mostrato nella console Groovy

Se non riesci a far funzionare questo semplice esempio, c'è qualcosa di sbagliato nel tuo ambiente, ad es. 'groovy.bat' non è sul tuo PATH. Se riesci a far funzionare questo esempio, dovresti essere in grado di lavorare da esso per raggiungere il tuo obiettivo.

+0

Ciao. grazie per la tua risposta, ma genera esattamente lo stesso risultato. Ad esempio def cmd = ['cd', 'd:/temp']; cmd.execute() => Il sistema non riesce a trovare il file specificato. Hai un'idea? – fabien7474

+0

Grazie mille! Tornato dal tuo esempio, sono riuscito a farlo funzionare con barre rovesciate per il percorso e "groovy.bat" invece di groovy. E ora funziona !! Grazie. Una domanda: sai perché "groovy.bat" funziona ma non "groovy" (mentre in un prompt dei comandi funzionano entrambi)? – fabien7474

+0

Suppongo che sia perché in un prompt dei comandi '.bat' è riconosciuto come un tipo di file eseguibile, ma a livello di sistema operativo è necessario fornire il nome completo del file a meno che non sia '.exe'. Per inciso, su Linux puoi usare 'grails' o 'grails.sh' –

2

modo più semplice:

generare una classe Groovy e il luogo in nel vostro/src/Cartella groove della vostra Grails progetto. Importa quella classe nella classe di dominio e utilizza le funzioni definite.

I miei 2 centesimi ...

4

Come del graal 1.3.6 del comando run-script è costruito in per lasciare che si esegue

grails run-script myScript.groovy 

Per le versioni precedenti di graal, check out my updated blog post da quello che Carlos ha pubblicato sopra.

Problemi correlati