2

我正在尝试创建简单的extension module.

我创建了Main.groovy文件

class Item {
   String item
}

new Item().sayHello() // this method supposed to be extension

我编译了它(没有运行)。

我创建了ItemExtension.groovy班级

class ItemExtension {
    def sayHello(Item self) {
        println "hello world"
    }
}

这是我的org.codehaus.groovy.runtime.ExtensionModule描述符

moduleName=Item extension module
moduleVersion=1.0
extensionClasses=ItemExtension

ItemExtension.groovy使用编译groovyc(我预编译Main.groovy以获取Item类)

groovyc ItemExtension.groovy

编译ItemExtension.classMETA-INF我放入.jar文件(重命名.rar)。它的结构看起来像这样

META-INF\services\org.codehaus.groovy.runtime.ExtensionModule
ItemExtension.class

我把它放在ItemExtension.jar同一个文件夹中Main.groovy并再次编译它,但带有cp参数 add jar

groovyc -cp ItemExtension.jar Main.groovy

但是当我尝试运行它时

groovy Main

我得到了这个例外

Caught: groovy.lang.MissingMethodException: No signature of method: Item.sayHell
o() is applicable for argument types: () values: []
groovy.lang.MissingMethodException: No signature of method: Item.sayHello() is a
pplicable for argument types: () values: []
    at Main.run(Main.groovy:6)

我做错了什么?

4

1 回答 1

3

您的扩展方法必须是静态的才能被识别(因为扩展模块必须是无状态的)并且Item类必须存在于自己的源文件中才能被识别(因为否则它是脚本的内部类)。

这是一个执行您想要的操作的 bash 脚本:

#!/bin/bash

echo "Create Item.groovy"
cat > 'Item.groovy' <<-EOF
class Item {
    String item
}
EOF

echo "Compile Item.groovy"
groovyc Item.groovy -d classes

echo "Create extension module class"
cat > 'ItemExtension.groovy' <<-EOF
class ItemExtension {
    static def sayHello(Item self) {
        println "hello world"
    }
}
EOF

echo "Create extension module descriptor"
mkdir -p classes/META-INF/services
cat > classes/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule <<-EOF
moduleName=Item extension module
moduleVersion=1.0
extensionClasses=ItemExtension
EOF

echo "Compile extension module"
groovyc -cp classes ItemExtension.groovy -d classes

echo "Creating script.groovy"
cat > 'script.groovy' <<-EOF
new Item().sayHello()
EOF

echo "Run script"
groovy -cp classes script.groovy
于 2016-03-08T10:40:14.183 回答