从groovy脚本加载脚本

时间:2012-01-25 14:28:25

标签: groovy load

File1.groovy

def method() {
   println "test"
}

File2.groovy

method()

我想在运行时加载/包含File1.groovy中的函数/方法,等于rubys / rake的加载。它们位于两个不同的目录中。

6 个答案:

答案 0 :(得分:29)

如果你不介意file2中的代码在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()

答案 1 :(得分:15)

您可以使用GroovyShell评估Groovy中的任何表达式或脚本。

File2.groovy

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

答案 2 :(得分:13)

如果file1.groovy是实际的班级class File1 {...},那将是最简单的。

鉴于此,另一种方法是将文件加载到GroovyClassLoader

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

File1.method() 

File1.newInstance().anotherMethod()

答案 3 :(得分:7)

我迟到了但是。这就是我们如何实现您的要求。所以,我有一个像这样的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;

在另一个文件中,可以通过首先实例化来访问这些函数。所以在file2中。

<强>文件2:

def somename
somename = load 'path/to/file1.groovy'
 //the you can call the function in file1 as

somename.Sometask(param1, param2, param3)

答案 4 :(得分:3)

这是我正在使用的。

1:将any_path_to_the_script.groovy写为一个类

2:在调用脚本中,使用:

def myClass = this.class.classLoader.parseClass(new File("any_path_to_the_script.groovy"))
myClass.staticMethod()

它在Jenkins Groovy脚本控制台中运行。我没有尝试过非静态方法。

答案 5 :(得分:1)

@tim_yates使用metaClass.mixin的答案应该可以工作,而无需对file1.groovy进行任何更改(即,使用脚本对象对mixin进行更改),但是不幸的是{ {1}}在这种情况下会导致SO错误(有关此特定问题,请参见GROOVY-4214)。但是,我使用以下 selective metaClass.mixin解决了该错误:

mixin

以上解决方案无需对def loadScript(def scriptFile) { def script = new GroovyShell().parse(new File(scriptFile)) script.metaClass.methods.each { if (it.declaringClass.getTheClass() == script.class && ! it.name.contains('$') && it.name != 'main' && it.name != 'run') { this.metaClass."$it.name" = script.&"$it.name" } } } loadScript('File1.groovy') method() File1.groovy中的调用者进行任何更改(除了需要引入对File2.groovy函数的调用之外)。