【问题标题】:add extension module to groovy class将扩展模块添加到 groovy 类
【发布时间】:2016-06-22 06:11:38
【问题描述】:

我正在尝试创建简单的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

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

groovyc ItemExtension.groovy

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

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

我将ItemExtension.jarMain.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)

我做错了什么?

【问题讨论】:

    标签: groovy extension-modules


    【解决方案1】:

    您的扩展方法必须是静态的才能被识别(因为扩展模块必须是无状态的)并且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
    

    【讨论】:

    • 哦,我还错过了您使用扩展 jar 编译的事实(这不是必需的,因为您的代码是动态的),但是 没有 它运行。执行脚本时,扩展名必须在类路径上:groovyc Main.groovy 然后groovy -cp ItemExtension.jar Main.groovy 应该可以工作
    • 还是不行。我想我需要重新阅读文档。也许忽略了一些东西(比如静态)
    • 用一个完整的例子编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2013-04-19
    相关资源
    最近更新 更多