Загрузить script из groovy script

File1.groovy

def method() {
   println "test"
}

File2.groovy

method()

Я хочу загрузить/включить функции/методы из File1.groovy во время выполнения, равный нагрузке rubys/rake. Они находятся в двух разных каталогах.

Ответ 1

Если вы не против кода в файле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()

Ответ 2

Это будет проще всего, если file1.groovy является фактическим классом class File1 {...}.

Учитывая, что другой способ сделать это - загрузить файл в GroovyClassLoader:

this.class.classLoader.parseClass("src/File1.groovy")

File1.method() 

File1.newInstance().anotherMethod()

Ответ 3

Вы можете оценить любое выражение или script в Groovy с помощью GroovyShell.

File2.groovy

GroovyShell shell = new GroovyShell()
def script = shell.parse(new File('/path/file1.groovy'))
script.method()

Ответ 4

Я опаздываю на это, но. Вот как мы добивались того, что вы просили. Итак, у меня есть 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)

Ответ 5

Вот что я использую.

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. Я не пробовал нестатические методы.