File1.groovy
def method() {
println "test"
}
File2.groovy
method()
Я хочу загрузить/включить функции/методы из File1.groovy во время выполнения, равный нагрузке rubys/rake. Они находятся в двух разных каталогах.
File1.groovy
def method() {
println "test"
}
File2.groovy
method()
Я хочу загрузить/включить функции/методы из File1.groovy во время выполнения, равный нагрузке rubys/rake. Они находятся в двух разных каталогах.
Если вы не против кода в файле2, находящегося в блоке with
, вы можете сделать:
new GroovyShell().parse( new File( 'file1.groovy' ) ).with {
method()
}
Другим возможным методом было бы изменить file1.groovy
на:
class File1 {
def method() {
println "test"
}
}
И затем в file2.groovy
вы можете использовать mixin
, чтобы добавить методы из file1
def script = new GroovyScriptEngine( '.' ).with {
loadScriptByName( 'file1.groovy' )
}
this.metaClass.mixin script
method()
Это будет проще всего, если file1.groovy
является фактическим классом class File1 {...}
.
Учитывая, что другой способ сделать это - загрузить файл в GroovyClassLoader
:
this.class.classLoader.parseClass("src/File1.groovy")
File1.method()
File1.newInstance().anotherMethod()
Вы можете оценить любое выражение или script в Groovy с помощью GroovyShell.
File2.groovy
GroovyShell shell = new GroovyShell()
def script = shell.parse(new File('/path/file1.groovy'))
script.method()
Я опаздываю на это, но. Вот как мы добивались того, что вы просили. Итак, у меня есть file1.gsh так:
File1:
println("this is a test script")
def Sometask(param1, param2, param3)
{
retry(3){
try{
///some code that uses the param
}
catch (error){
println("Exception throw, will retry...")
sleep 30
errorHandler.call(error)
}
}
}
return this;
И в другом файле эти функции можно получить путем создания экземпляра в первую очередь. Итак, в файле2.
File2:
def somename
somename = load 'path/to/file1.groovy'
//the you can call the function in file1 as
somename.Sometask(param1, param2, param3)
Вот что я использую.
1: Напишите any_path_to_the_script.groovy
как класс
2: В вызывающем script используйте:
def myClass = this.class.classLoader.parseClass(new File("any_path_to_the_script.groovy"))
myClass.staticMethod()
Он работает в консоли Jenkins Groovy script. Я не пробовал нестатические методы.