导入Groovy脚本到另一个Groovy脚本在运行时
问题描述:
我有一个Groovy文件看起来像这样(目前)。导入Groovy脚本到另一个Groovy脚本在运行时
main.groovy
import org.packages.mystuff.JavaClassIAmUsing;
public class MyObject {
def rate(item){
def o = evaluate(new File (new File(getClass().protectionDomain.codeSource.location.path).parent),"CommonFunctions.groovy");
println o.whoami();
}
}
我有一个名为
CommonFunctions.groovy
def whoami() {return 'no body';}
我想包括CommonFunctions脚本到另一个常规文件主要脚本,但脚本的位置不知道在构建时(即我可以n不要硬编码脚本中的绝对文件路径,或者与脚本存储位置相关的java进程的绝对路径)。
我所知道的是,该脚本会在一起或者在相对于调用脚本的位置(比如子目录)。
我已经尝试尝试和位置调用脚本的位置,但我得到的错误
No signature of method: MyObject.evaluate()
我怎样才能全球化志愿服务青年这个脚本,考虑到主脚本在运行时使用GroovyClassLoader.parseClass访问(File)方法。
答
我不是很确定你为什么要这样做,我认为制作一个CommonsFunctions
类可以简单得多,你可以正常实例化并在任何地方使用。
然而,是可以达到你想要的东西;使用Groovy,有没有那么多的限制......
有两个问题与您的建议解决方案:
- 的getClass()你
MyObject
类中自然指的是......在MyObject
类,所以你试图找到脚本的位置将失败。您处于正确的轨道上,但您需要使用周围的Script类来解析脚本位置。 -
evaluate
并未真正发挥作用,你觉得它的方式。该evaluate
方法的结果是脚本,而不是Script
类的一个实例的结果。解决这个问题的一种方法是将CommonFunction
中的方法重写为闭包属性。评估脚本时,这些属性将在shellBinding
对象中可用。
因此,与这些重写,你最终是这样的:
main.groovy
class MyObject {
def scriptDir
def rate(item) {
def commonFunctionsScriptFile = new File(scriptDir, "CommonFunctions.groovy")
def binding = new Binding()
new GroovyShell(binding).evaluate(commonFunctionsScriptFile)
println binding.variables.whoami()
}
}
scriptFile = new File(getClass().protectionDomain.codeSource.location.path)
new MyObject(scriptDir: scriptFile.parentFile).rate(null)
这里,脚本文件的位置在脚本中解决,而不是在内在的阶级。
CommonFunctions。常规
whoami = { 'no body' }
这里,whoami
不再是方法,但是其将被添加到结合的封闭性。确保你不为前缀此属性与def
,因为它将是一个本地变量,而不是添加到绑定对象的属性。
这些改写后的输出是预期的:no body
。