2009-12-18 27 views
6

Basit bir görev gibi görünüyor, ancak onu yönetmeyi başaramadım.Grails uygulamasından Groovy Script nasıl çalıştırılır?

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

Şimdi, benim benim Bakım Servis Sınıfı ile (ve bazı giriş argümanlar kendisine geçen) Bu komut dosyasını çalıştırmak istiyorum:

ben isteminden çağrılırken Windows Vista altında iyi çalışır gelenekselleşmiş bir senaryomuz var (aşağıdaki gibi bir kontrolörden çağrılır), aşağıdaki gibi çalışır:

Hiç çalışmıyor!

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

1- nasıl grails uygulamadan gelenekselleşmiş bir çalıştırabiliriz: Hatta() yöntemi herhangi komutu tanıma (gibi "cd .".execute()) atma istisna yürütmek için yönetmek değil mi?

2- Buradaki en iyi uygulamalar nelerdir? Örneğin, QuartzPlugin'i ve bir betiği yürütmek için triggerNow yöntemini kullanmalı mıyım? Bir Gant Görevini kullanmalı mıyım? Evet ise nasıl yapılır?

Teşekkür ederiz.

+0

o gelenekselleşmiş bir "senaryo" yerine arayabileceğiniz bir sınıf olmak zorunda özel bir nedeni var mı? – Ash

+0

Evet. Grails ortamı olmadan da yapılacak bu mükemmel senaryoya ihtiyacım var. – fabien7474

cevap

5

, groovy varsayarak çalışması gerekir aşağıdaki PATH değişkeni geçerli:

Eğer uygulama konsolunda sürecin çıkışını görüntülemek istiyorsanız
def cmd = ['groovy.bat', 'cp', 'src/groovy scripts/myscript.groovy'] 
cmd.execute() 

, böyle bir şey denemelisiniz yerine

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

Güncelleme:

1: \ tmp \ foo.groovy: Dosya C oluşturma yorumuna cevaben aşağıda, (Windows'taysaniz varsayılmıştır) aşağıdakileri deneyin. Bu dosyanın içeriği basitçe olmalıdır:

println 'it works!' 

2:

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

3: Sen script sonucu görmelisiniz (metin 'çalıştığını harika konsolunda, aşağıdaki çalıştırın ! ') Groovy konsolunda gösterilen

Bu basit örneği işe yaramıyorsanız, ortamınızda bir sorun var demektir, örn. 'groovy.bat' PATH'nizde değil. Eğer bu örnek çalışmayı başarabilirseniz, o zaman hedefinize ulaşmak için ondan daha fazla çalışabilmelisiniz.

+0

Merhaba. Cevabınız için teşekkür ederim ama aynı sonucu veriyor. Örneğin, def cmd = ['cd', 'd:/temp']; cmd.execute() => Sistem belirtilen dosyayı bulamıyor. Bir fikrin var mı? – fabien7474

+0

Çok teşekkürler! Örneğinizden, yol için ters eğik çizgi ve groovy yerine "groovy.bat" ile çalışmayı başardım. Ve şimdi çalışıyor! Teşekkürler. Tek soru: 'groovy.bat' neden 'groovy' değil (her iki durumda da bir komut isteminde iken) çalışır? – fabien7474

+0

Sanırım bir komut isteminde '.bat' yürütülebilir dosya türü olarak tanınıyor, ancak işletim sistemi düzeyinde '.exe' olmadıkça tam dosya adını sağlamanız gerekiyor. Bu arada, Linux'ta 'grails' veya 'grails.sh' kullanabilirsiniz. –

2

hafiflemek yol:

sizin Grails Projesi senin/src/harika Klasör en Groovy Class ve yeri bir oluşturun. Bu Sınıfı Etki Alanı Sınıfınıza içe aktarın ve tanımladığınız İşlevleri kullanın. Eğer komut dosyası (servis yöntemine ayrı bir işlemde) uyumsuz çalışan sakıncası yoksa

Benim 2 Cents

...

4

run-script komut inşa edilmiştir önceki sürümleri için

grails run-script myScript.groovy 

çalışmasına izin 1.3.6 grails itibariyle Grails, check out my updated blog post yukarıda Carlos ne gönderdiğini. bastianneu aşağıda anlaşılacağı gibi

İlgili konular