2009-12-18 33 views
6

Vâng, có vẻ như một nhiệm vụ đơn giản nhưng tôi không quản lý để chạy nó.Làm thế nào để thực thi một Groovy Script từ ứng dụng Grails của tôi?

Tôi có một kịch bản hấp dẫn mà chạy tốt trên Windows Vista khi gọi từ dấu nhắc:

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

Bây giờ, tôi muốn thực hiện kịch bản này (và đi qua nó một số đối số đầu vào) thông qua Dịch vụ Lớp bảo trì my my (được gọi từ bộ điều khiển) như sau,

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

Nó không hoạt động chút nào! Tôi thậm chí không quản lý để có thực thi() phương pháp nhận biết bất kỳ lệnh (như "cd .".execute()) ném ngoại lệ:

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

1- Làm thế nào tôi có thể thực hiện một kịch bản hấp dẫn từ ứng dụng Grails của tôi?

2 - Các phương pháp hay nhất ở đây là gì? Ví dụ, tôi nên sử dụng QuartzPlugin và sau đó là phương thức triggerNow để thực thi một kịch bản? sao tôi nên sử dụng Gant Task? Nếu có, làm thế nào để làm điều đó?

Cảm ơn bạn.

+0

Có lý do cụ thể nào đó phải là một "kịch bản" hấp dẫn, chứ không phải là một lớp bạn có thể gọi, như bastianneu đề xuất dưới đây? – Ash

+0

Có. Tôi cần kịch bản groovy này để được thực thi mà không có môi trường Grails. – fabien7474

Trả lời

5

Nếu bạn không nhớ kịch bản của bạn chạy không đồng bộ (trong một quá trình riêng biệt với phương pháp dịch vụ), sau đây nên làm việc giả groovy là vào biến PATH của bạn:

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

Nếu bạn muốn xem kết quả của quá trình này trong việc áp dụng giao diện điều khiển, bạn nên thử một cái gì đó như thế này thay vì

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

Cập nhật: Đáp lại bình luận của bạn dưới đây, hãy thử như sau (mà giả sử bạn đang ở trên Windows):

1: Tạo file C: \ tmp \ foo.groovy. Nội dung của tập tin này nên đơn giản:

println 'it works!' 

2: Trong giao diện điều khiển groovy, chạy như sau:

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

3: Bạn sẽ thấy kết quả của kịch bản (văn bản 'nó hoạt động ! ') được hiển thị trong bảng điều khiển Groovy

Nếu bạn không thể làm ví dụ đơn giản này hoạt động, có điều gì đó sai với môi trường của bạn, ví dụ: 'groovy.bat' không có trong PATH của bạn. Nếu bạn có thể nhận được ví dụ này làm việc, sau đó bạn sẽ có thể làm việc chuyển tiếp từ nó để đạt được mục tiêu của bạn.

+0

Xin chào. cảm ơn bạn cho câu trả lời của bạn nhưng nó ném chính xác cùng một kết quả. Ví dụ def cmd = ['cd', 'd:/temp']; cmd.execute() => Hệ thống không thể tìm thấy tệp được chỉ định. Bạn có ý tưởng không? – fabien7474

+0

Cảm ơn rất nhiều! Trở lại từ ví dụ của bạn, tôi đã quản lý để làm cho nó hoạt động với các dấu gạch chéo ngược cho đường dẫn và "groovy.bat" thay vì groovy. Và bây giờ nó hoạt động !! Cám ơn. Một câu hỏi: bạn có biết lý do tại sao 'groovy.bat' hoạt động nhưng không phải là 'groovy' (trong khi dấu nhắc lệnh đều hoạt động)? – fabien7474

+0

Tôi đoán đó là bởi vì trong một dấu nhắc lệnh '.bat' được công nhận như là một loại tập tin thực thi, nhưng ở cấp độ hệ điều hành bạn cần phải cung cấp tên tập tin đầy đủ, trừ khi nó '.exe'. Ngẫu nhiên, trên Linux bạn có thể sử dụng 'grails' hoặc 'grails.sh' –

2

Cách dễ nhất:

Tạo một lớp Groovy và đặt vào trong/src/groovy Thư mục dự án Grails của bạn. Nhập Lớp học đó vào Lớp Miền của bạn và sử dụng các Hàm bạn đã xác định.

2 Cents My ...

4

Tính đến grails 1.3.6 lệnh run-script được xây dựng để cho phép bạn chạy

grails run-script myScript.groovy 

Đối với các phiên bản trước của grails, check out my updated blog post từ những gì Carlos đã đăng ở trên.

Các vấn đề liên quan