无法使Groovy扩展模块工作

时间:2017-09-27 16:04:53

标签: groovy extension-methods groovyshell groovy-console extension-modules

我正在尝试创建扩展模块,然后在不同的项目/脚本中使用它但无法使其工作。这就是我在做的事情:

步骤1:创建一个名为TemperatureUtils.groovy的文件,这是一个类别类。这是来源:

package utils

class TemperatureUtils {

    Double toFahrenheit(Number celcius) {
        (9 * celcius / 5) + 32
    }

    Double toCelcius(Number fahrenheit) {
        (fahrenheit - 32) * 5 / 9
    }
}

步骤2:创建扩展模块描述符 - org.codehaus.groovy.runtime.ExtensionModule,其中包含以下内容:

moduleName=Some-Utils
moduleVersion=1.0
extensionClasses=utils.TemperatureUtils
staticExtensionClasses=

步骤3:编译类并手工创建具有以下结构的jar文件:

extensionUtils.jar
  |-- utils
  |     |-- TemperatureUtils.class
  |
  |-- META-INF
        |-- services
              |-- org.codehaus.groovy.runtime.ExtensionModule

步骤4:创建新脚本以使用扩展模块。脚本来源:

import org.codehaus.groovy.control.CompilerConfiguration

def groovyScript = '''
//Following line just confirms that the jar file is indeed on the classpath of this script
assert 25 == (new utils.TemperatureUtils()).toCelcius(77)

//Actually using the category now
assert 77.toCelcius()       == 25
assert 25.toFahrenheit()    == 77
'''

def compilerConfig = new CompilerConfiguration()

compilerConfig.setClasspath(/E:\temp\jar\extensionUtils.jar/)

def shell = new GroovyShell(compilerConfig)
shell.evaluate(groovyScript)

步骤5:执行脚本。在这里,我得到以下例外:

groovy.lang.MissingMethodException: No signature of method: java.lang.Integer.toCelcius() is applicable for argument types: () values: []
    at Script1.run(Script1.groovy:6)
    at ConsoleScript2.run(ConsoleScript2:16)

现在,我尝试过一些事情,但无法让它发挥作用:

  • 删除了最后一行 - " staticExtensionClasses ="从扩展模块描述符,但它没有工作。
  • 使用@Category(Number)注释将TemperatureUtils.groovy类更改为实际类别,并从两种方法中删除参数(并使用' this'而不是' celcius&#39 ;以及' fahrenheit' param-names in methods' body)但它仍然不起作用。
  • 用Google搜索,但没有找到太多信息。也偶然发现this,但这对我也没有帮助。

非常感谢精彩的stackoverflow社区提供的任何帮助! :)

1 个答案:

答案 0 :(得分:0)

以下适用于我,使用Groovy 2.4.5。基于this post

首先,将>>> def bad_foo(a: 'int'): ... pass >>> def good_foo(a: int): ... pass >>> bad_foo.__annotations__['a'] == good_foo.__annotations__['a'] False 更改为TemperatureUtils方法:

package utils

static

然后,我不会使用class TemperatureUtils { static Double toFahrenheit(Number celcius) { (9 * celcius / 5) + 32 } static Double toCelcius(Number fahrenheit) { (fahrenheit - 32) * 5 / 9 } } ,只需设置CompilerConfiguration即可。 E.g。

CLASSPATH

其中$ export CLASSPATH=../utils/build/libs/temp.jar $ groovy client.groovy 只是:

Client.groovy