导入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,有没有那么多的限制......

有两个问题与您的建议解决方案:

  1. 的getClass()你MyObject类中自然指的是......在MyObject类,所以你试图找到脚本的位置将失败。您处于正确的轨道上,但您需要使用周围的Script类来解析脚本位置。
  2. evaluate并未真正发挥作用,你觉得它的方式。该evaluate方法的结果是脚本,而不是Script类的一个实例的结果。解决这个问题的一种方法是将CommonFunction中的方法重写为闭包属性。评估脚本时,这些属性将在shell Binding对象中可用。

因此,与这些重写,你最终是这样的:

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