2012-07-23 63 views
5

我想將groovy嵌入到一個大的Java應用程序中。GroovyShell:嵌入式執行

Java應用程序應該在啓動時加載一些實用的Groovy腳本。

應用程序應該多次運行其他腳本。還需要在GUI中輸入一些代碼並在用戶請求下執行它。

我現在面臨的問題是這樣的:

我加載像這樣啓動腳本:

GroovyShell gShell = new GroovyShell(); 
gShell.evaluate(new FileReader("scripts/autoload.groovy")); 

假設我autoload.groovy包含:

def prnt(m) { 
    println("From Groovy: " + m); 
} 

這工作正常。但是,當我想運行使用的用戶命令:

gShell.evaluate("prnt 66"); 

我得到的錯誤: groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

如何已經載入我的用戶腳本訪問的方法是什麼?

注意:我也試過「autoload.prnt 88」,但仍然出現錯誤。

回答

4

每個evaluate呼叫被編譯和運行作爲一個單獨的Script,和

def prnt(m) { 
    println("From Groovy: " + m); 
} 

定義從autoload.groovy生成的腳本類,這是不能從隨後的「主叫」腳本訪問的方法。但是,由同一個GroovyShell運行的腳本共享相同的綁定,因此您可以將值存儲在綁定中的一個腳本中,並在另一個腳本中訪問它們。存儲的結合相關的值就是價值分配到否則未聲明的變量的情況:

prnt = { m -> 
    println("From Groovy: " + m); 
} 

這存儲在綁定變量prnt一個封閉的,你甚至可以從其他腳本封閉在同一外殼。需要注意的是

def prnt = { m -> 

Closure prnt = { m -> 

工作,因爲def或類型使它成爲一個局部變量聲明(私人此特定腳本),而不是分配給具有約束力。

相關問題