7

我們正在尋找groovy腳本的包含機制,以便爲橫切關注點留出空間。Groovy是否提供包含機制?

在我的示例中,我們將Web服務端點視爲常規腳本,並且希望登錄到我們的Web服務協議。爲此,我們使用我們的隱式對象(從我們的框架中獲取)來創建日誌記錄語句。

但是,如果我們在每個Web服務端點中編寫代碼,這是樣板代碼。

我們正在尋找像include()這樣的東西,其中包括其他groovy腳本,有沒有什麼想法如何做到這一點?

回答

1

看那評價(文件)功能:

Object evaluate(File file) 

http://groovy.codehaus.org/api/groovy/lang/Script.html

+1

如果不解釋如何製作或獲取Script對象,則無用,因爲該類是抽象的。 – Blaine 2011-10-20 16:12:21

+0

通常,將調用此代碼編譯爲匿名'Script'子類的實例。 – 2014-05-01 17:39:21

10

Groovy將它的文件視爲對象(認爲它是自動換行)。它使java classpath中的所有.groovy文件都可以作爲類來使用。所以,如果你有文件util.groovy,包含這樣的事情裏面:

def static AuxMethod() { 
    return "Hello World" 
} 

從另一個文件中調用它,你只寫:

println util.AuxMethod() 

就是這樣。再次,確保您的util.groovy文件位於類路徑中。

+0

我懷疑只有你的groovy腳本是面向對象的類纔有效。使用常規功能腳本,可能不起作用? – djangofan 2011-06-19 03:26:07

+2

如果util.groovy腳本使用大寫Util.groovy重命名,並且引用相應地更改爲'println Util.AuxMethod()' – Blaine 2011-10-20 18:24:35

+3

我之前的評論的後續內容,則此示例僅適用於Windows,至少從Windows開始。這也適用於UNIX。直到我將「util」重命名爲「Util」後才能工作。此外,大多數經驗Java + Groovy開發人員將編寫方法聲明以符合Java約定:static def auxMethod。即類型名稱前的「static」和所有方法以小寫開頭(例如,請參閱java.util.Collections中的大量靜態方法)。 – Blaine 2011-10-24 12:08:26

2

從當前腳本調用腳本u.groovy,沿原來的參數給u.groovy傳球,運行

run(new File('u.groovy'), args) 

很明顯,你還可以發送任何你想要的字符串參數:

run(new File('u.groovy'), 
     ['one', new File('two.text').absolutePath] as String[]) 
1

我做了一些關於這個我正在創建的域特定語言的研究。有三種可能性:

  1. 將您的類創建爲繼承父類groovy類。將您的共享代碼放在基類中。

  2. 使用ScriptBaseClass請參見http://groovy.codehaus.org/Embedding+Groovy。這是您創建所有腳本的類。

  3. 使用導入靜態方法功能。請注意,您可以在java容器內執行此操作(請參閱http://mrhaki.blogspot.com/2011/06/groovy-goodness-add-imports.html)。

所有這些都很好。我的首選是ScriptBaseClass。這效果最好,如果通用代碼就是Groovy(該ScriptBaseClass 必須是一個常規類,它不可能是一個Java類。)

當然,所有這些物品,你仍然需要實際調用常規代碼中的常用方法。例如:

doCommonStuff(); 
. 
. do the rest of it here 
. 

這不是太可怕,我不認爲。當然就像添加某種#include預處理器語句一樣。

最後,所有這些都假定您可以訪問調用Groovy代碼的java程序。如果情況並非如此,您仍然可以使用靜態導入。這只是一個額外的代碼行。

import static com.mycompany.mycode.doCommonStuff 
doCommonStuf() 
. 
. do the rest of it here 
.