如何在常规中“包含”常用方法

时间:2013-04-01 17:38:29

标签: groovy

我开发了许多由Serviio用作插件的groovys。 这些插件使用的许多方法都很常见,但是在进行更改时,每个插件都需要更新。因此,我想从tools.groovy中“包含”每个插件中的那些方法。我尝试了其他帖子中提出的2种不同的方法。

我尝试使用

evaluate(new File("C:\\Program Files\\Serviio\\plugins\\tools.groovy"))

在每个插件的开头,tools.groovy只有

class Tools{method1{return}method2{return}}

但是在执行插件时我得到了

Caught: groovy.lang.MissingMethodException: No signature of method: Tools.main() is applicable for argument types: () values: []

如果我再添加

void main(args) { } 

到类工具,错误消失但是运行Tools.main而不是plugin.main而且我没有输出。

我建议的第二种方法是使用

def script = new GroovyScriptEngine( '.' ).with {
  loadScriptByName( 'C:\\Program Files\\Serviio\\plugins\\tools.groovy' )
} 
this.metaClass.mixin script

然而,这会给出错误

unexpected token: this @ line 55, column 2.
this.metaClass.mixin script

任何关于如何使这些解决方案都有效的建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

您是否尝试定义公共基本脚本并将其作为编译器配置提供。

http://groovy.codehaus.org/Embedding+Groovy

来自groovy文档...

class ScriptBaseTest {

  @Test
  void extend_groovy_script() {
    def compiler = new CompilerConfiguration()
    compiler.setScriptBaseClass("ScriptBaseTestScript")

    def shell = new GroovyShell(this.class.classLoader, new Binding(), compiler)

    assertEquals shell.evaluate("foo()"), "this is foo"
  }
}

abstract class ScriptBaseTestScript extends Script {
  def foo() {
    "this is foo"
  }
}