2016-03-08 153 views
2

我想创建简单的extension module添加扩展模块到groovy类

我创建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.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) 

我做了什么错?

回答

1

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

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

嗯。没有帮助 – lapots

+2

哦,我也错过了使用扩展jar(这不是必须的,因为你的代码是动态的)编译的事实,但运行*没有*它。在执行脚本时,扩展必须位于classpath上: 'groovyc Main.groovy' then groovy -cp ItemExtension.jar Main.groovy' 应该工作 – melix

+0

仍然不起作用。我想我需要重新阅读文档。也许忽略了一些东西(如静态) – lapots