2009-10-01 202 views
1

我需要從我的Java應用程序運行一些外部代碼,這些代碼會經常更新並與應用程序的其他部分正交。由於我不會爲每次代碼更改重新部署整個應用程序(並出於其他原因),因此我們選擇使用groovy作爲此代碼,並將其存儲在文件系統或數據庫中。使用GroovyClassLoader與GroovyShell的優缺點

From the documentation我明白,我有兩種方法來運行代碼 - 使用GroovyShellGroovyClassLoader(EVAL不適合在這裏)

什麼是每種方法的利弊?

回答

3

GroovyShell使用下面的GroovyClassLoader。除非您需要僅由GroovyClassLoader提供的功能,否則請使用GroovyShell。

+0

但GroovyShell緩存執行的腳本? – 2009-10-05 07:24:28

+0

我沒有專家即時啓動我自己的groovyshell嵌入,但編譯器配置類包括/ ** *獲取編寫類的目標目錄。 */ public File getTargetDirectory(){ return this.targetDirectory; } – 2011-06-27 12:01:21

2

GroovyShell使用默認的類加載器,直到你在定製類路徑的腳本加載的東西,那麼它切換到自定義GroovyClassLoader,這可能會導致問題的加載一些JDBC驅動程序或JNDI項目,等等......所以,如果您的默認classloader已經具有它需要的類路徑,如果你可以避免在你的Java代碼中實例化一個新的GroovyClassLoader對象,那麼用一個簡單的GroovyShell加載一個shell腳本將使用默認的類加載器,你會更適合它。

希望我明白你的問題。

+0

我有一個Java應用程序,它包裝了一些邏輯,這些邏輯是在groovy中的一個自定義DSL中編寫的。 Java應用程序的代碼很少改變,常規代碼(DSL)頻繁更改。我不習慣每次都要解釋DSL代碼,而是將其編譯爲字節碼以便稍後執行。 GroovyShell可以做到嗎? – 2011-12-08 15:04:55

+0

如果你的意圖是編譯成字節碼,那麼爲什麼要使用Groovy?另外,頻繁變化的部分似乎適合動態編譯而不是預編譯。就個人而言,對於DSL,我會使用XTend而不是Groovy。每個人都有自己的喜好。 – djangofan 2012-10-11 02:38:01

+0

http://www.eclipsecon.org/2011/sessions/?page=sessions&id=2053 – djangofan 2012-10-11 02:39:14