File1.groovy
def method() {
println "test"
}
File2.groovy
method()
我想在运行时加载/包含File1.groovy中的函数/方法,等于rubys / rake的加载。它们位于两个不同的目录中。
答案 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
函数的调用之外)。