我正在尝试创建简单的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.class
编译META-INF
我放入.jar
文件(重命名为.rar
)。
它的结构看起来像这样
META-INF\services\org.codehaus.groovy.runtime.ExtensionModule
ItemExtension.class
我将ItemExtension.jar
放在与Main.groovy
相同的文件夹中并再次编译,但使用cp
参数添加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)
我做错了什么?
答案 0 :(得分:2)
您的扩展方法必须是静态的才能被识别(因为扩展模块必须是无状态的)并且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