2016-03-08 156 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