我有一个脚本,其中包含我想从其他脚本访问的实用程序方法。
我在我的java代码中加载我的脚本
static {
GroovyShell shell = new GroovyShell();
//This is the script that has the utility
groovyUtils = shell.parse(new InputStreamReader(MyJavaClass.class.getResourceAsStream("scripts/json/MyUtils.groovy")));
//This is the script that does thing
groovyScript = shell.parse(new InputStreamReader(MyJavaClass.class.getResourceAsStream("scripts/json/MyScript.groovy")));
}
我想公开MyUtils.groovy
中可用于MyScript.groovy
的方法(以及将来的其他脚本)
答案 0 :(得分:2)
有多种方法可以实现这一目标。
你在谈论方法,所以我猜你在MyUtils.groovy
有一个班级。
在这种情况下,您可以指定Binding
,例如
def myUtils = new MyUtils()
def binding= new Binding([ method1: myUtils.&method1 ])
def shell= new GroovyShell(binding)
shell.evaluate(new File("scripts/json/MyScript.groovy"))
在上文中,您可以在脚本中引用method1
,最终将在myUtils
实例上调用它。
另一种解决方案是指定脚本基类,例如
def configuration = new CompilerConfiguration()
configuration.setScriptBaseClass('MyUtils.groovy')
def shell = new GroovyShell(this.class.classLoader, new Binding(), configuration)
MyUtils
类必须延伸Script
然后;所有方法都可以在使用shell
解析的脚本中使用。
嵌入/运行Groovy的方法基本上有多种。在设计DSL时经常讨论这些问题。你可以看看,例如here,如果您之前没有搜索过它。