将扩展模块添加到 groovy class

add extension module to groovy class

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

我创建了 Main.groovy 个文件

class Item {
   String item
}

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

我编译了它(不是运行)。

我创建了ItemExtension.groovyclass

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

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

moduleName=Item extension module
moduleVersion=1.0
extensionClasses=ItemExtension

I compiled ItemExtension.groovy using groovyc (I precompiled Main.groovy order to get Item class)

groovyc ItemExtension.groovy

META-INF 编译 ItemExtension.class 我放入 .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)

我做错了什么?

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

这是一个 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