2017-07-08 1 views
1

J'ai quelques scripts de bibliothèque: lib1.groovy:Y compris certains scripts Groovy dans un script groovy

def a(){ 
} 

lib2.groovy:

def b(){ 
} 

lib3.groovy:

def c(){ 
} 

et que vous souhaitez utiliser dans un autre scripts: conf.groovy:Conf.groovy est configuré par l'utilisateur et il n'est pas au courant de mes scripts lib d'arrière-plan! il ne connaît que les méthodes/tâches fournies: a(), b(), c(). En fait, j'ai créé des scripts lib pour la simplicité de l'utilisateur.

Est-il possible d'inclure tous les scripts d'un répertoire lib (scripts lib1, lib2m, lib3) dans le (s) script (s) conf.groovy? Ou, y a-t-il un mécanisme de rechange à cela? J'essaie d'exécuter conf.groovy dans un script runner/java (en utilisant groovy shell, loader ou script engine).

main.groovy:

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

double possible de [ Charger le script du script groovy] (https://stackoverflow.com/questions/9004303/load-script-from-groovy-script) –

+0

Merci Szymon! mais je ne veux pas insérer def script = new GroovyScriptEngine ('.') .with {loadScriptByName ('lib1.groovy')} ce script .metaClass.mixin dans mon fichier conf.groovy !. conf.groovy est un script que je donne à l'utilisateur pour configurer ses tâches et je ne veux pas que l'utilisateur s'en mêle. En fait, j'ai un autre script (main.groovy) qui exécute confg.groovy (en utilisant GroovyShell, Loader ou ScriptEngine). J'ai édité la question pour être plus clair. –

+0

vous avez c() dans lib2 et dans lib3. Lequel devrait être appelé? – daggett

Répondre

1

v1

utilisation import static et la déclaration des méthodes statiques:

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

ou d'une autre idée (mais pas sûr que vous avez besoin de cette complexité): utiliser GroovyShell pour analyser tous les scripts lib. à partir de chaque classe de script lib, obtenez toutes les méthodes déclarées non standard, convertissez-les en MethodClosure et transmettez-les comme une liaison dans le script conf.groovy. Et beaucoup de questions ici comme: quoi faire si la méthode déclarée dans plusieurs Libs ...

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()