2017-07-08 145 views
1

我有一些庫腳本: lib1.groovy:包括Groovy腳本一些Groovy腳本

def a(){ 
} 

lib2.groovy:

def b(){ 
} 

lib3.groovy:

def c(){ 
} 

並希望在另一個腳本中使用它們: conf.groovy:

a() 
b() 
c() 

conf.groovy是由用戶配置的,他不知道我的後臺lib腳本!他只知道提供的方法/任務:a(),b(),c()。實際上我爲用戶簡單創建了lib腳本。

有什麼辦法可以將lib目錄(腳本lib1,lib2m,lib3)中的所有腳本包含到conf.groovy腳本中? 或者,有沒有其他的機制呢? 我想在runner腳本/ java類中運行conf.groovy(使用groovy shell,loader o腳本引擎)。

main.groovy:

File currentDir = new File(".") 
String[] roots = {currentDir.getAbsolutePath()} 
GroovyScriptEngine gse = new GroovyScriptEngine(roots) 
gse.run('confg.groovy', binding) 
+0

的可能的複製[從groovy腳本加載腳本](https://stackoverflow.com/questions/9004303/load-script-from-groovy-script) –

+0

謝謝Szymon!但我不想在我的conf.groovy文件中插入def script = new GroovyScriptEngine('。').with {loadScriptByName('lib1.groovy')} this.metaClass.mixin腳本! conf.groovy是一個腳本,我給用戶配置他的任務,我不希望用戶參與此。其實我有另一個腳本(main.groovy)運行confg.groovy(使用GroovyShell,Loader或ScriptEngine)。我編輯的問題更清楚。 –

+0

你有c()在lib2和lib3中。哪一個應該被稱爲? – daggett

回答

1

V1

使用import static和靜態方法聲明:

Lib1.groovy

static def f3(){ 
    println 'f3' 
} 
static def f4(){ 
    println 'f4' 
} 

Conf.groovy

import static Lib1.* /*Lib1 must be in classpath*/ 

f3() 
f4() 

V2

或另一個想法(但不知道你需要這種複雜性):使用GroovyShell解析所有LIB腳本。從每個lib腳本類中獲取所有非標準的聲明方法,將它們轉換爲MethodClosure並將它們作爲綁定傳遞給conf.groovy腳本。而很多的問題在這裏喜歡:做什麼,如果在幾個利布斯聲明的方法...

import org.codehaus.groovy.runtime.MethodClosure 
def shell = new GroovyShell() 
def binding=[:] 
//cycle here through all lib scripts and add methods into binding 
def script = shell.parse(new File("/11/tmp/bbb/Lib1.groovy")) 
binding << script.getClass().getDeclaredMethods().findAll{!it.name.matches('^\\$.*|main|run$')}.collectEntries{[it.name,new MethodClosure(script,it.name)]} 

//run conf script 
def confScript = shell.parse(new File("/11/tmp/bbb/Conf.groovy")) 
confScript.setBinding(new Binding(binding)) 
confScript.run() 

Lib1.groovy

def f3(){ 
    println 'f3' 
} 
def f4(){ 
    println 'f4' 
} 

Conf.groovy

f3() 
f4()