2013-03-13 247 views
3

我有一個Groovy文件看起來像這樣(目前)。導入Groovy腳本到另一個Groovy腳本在運行時

main.groovy

import org.packages.mystuff.JavaClassIAmUsing; 
public class MyObject { 

    def rate(item){ 
     def o = evaluate(new File (new File(getClass().protectionDomain.codeSource.location.path).parent),"CommonFunctions.groovy"); 
     println o.whoami(); 

    } 
} 

我有一個名爲

CommonFunctions.groovy

def whoami() {return 'no body';} 

我想包括CommonFunctions腳本到另一個常規文件主要腳本,但腳本的位置不知道在構建時(即我可以n不要硬編碼腳本中的絕對文件路徑,或者與腳本存儲位置相關的java進程的絕對路徑)。

我所知道的是,該腳本會在一起或者在相對於調用腳本的位置(比如子目錄)。

我已經嘗試嘗試和位置調用腳本的位置,但我得到的錯誤

No signature of method: MyObject.evaluate() 

我怎樣才能全球化志願服務青年這個腳本,考慮到主腳本在運行時使用GroovyClassLoader.parseClass訪問(File)方法。

回答

2

我不是很確定你爲什麼要這樣做,我認爲製作一個CommonsFunctions類可以簡單得多,你可以正常實例化並在任何地方使用。

然而,可以達到你想要的東西;使用Groovy,有沒有那麼多的限制......

有兩個問題與您的建議解決方案:

  1. 的getClass()你MyObject類中自然指的是......在MyObject類,所以你試圖找到腳本的位置將失敗。您處於正確的軌道上,但您需要使用周圍的Script類來解析腳本位置。
  2. evaluate並未真正發揮作用,你覺得它的方式。該evaluate方法的結果是腳本,而不是Script類的一個實例的結果。解決這個問題的一種方法是將CommonFunction中的方法重寫爲閉包屬性。評估腳本時,這些屬性將在shell Binding對象中可用。

因此,與這些重寫,你最終是這樣的:

main.groovy

class MyObject { 
    def scriptDir 

    def rate(item) { 
     def commonFunctionsScriptFile = new File(scriptDir, "CommonFunctions.groovy") 
     def binding = new Binding() 
     new GroovyShell(binding).evaluate(commonFunctionsScriptFile) 
     println binding.variables.whoami() 
    } 
} 

scriptFile = new File(getClass().protectionDomain.codeSource.location.path) 
new MyObject(scriptDir: scriptFile.parentFile).rate(null) 

這裏,腳本文件的位置在腳本中解決,而不是在內在的階級。

CommonFunctions。常規

whoami = { 'no body' } 

這裏,whoami不再是方法,但是其將被添加到結合​​的封閉性。確保你不爲前綴此屬性與def,因爲它將是一個本地變量,而不是添加到綁定對象的屬性。

這些改寫後的輸出是預期的:no body