Включение некоторых отличных сценариев в отличные сценарии

У меня есть несколько библиотечных скриптов: lib1.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? Или есть какой-то альтернативный механизм этому? Я пытаюсь запустить conf.groovy в сценарии /java-классе runner (используя groovy shell, загрузчик или механизм сценариев).

main.groovy:

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

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()
Другие вопросы по тегам