我正在尝试创建扩展模块,然后在不同的项目/脚本中使用它但无法使其工作。这就是我在做的事情:
步骤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)
现在,我尝试过一些事情,但无法让它发挥作用:
非常感谢精彩的stackoverflow社区提供的任何帮助! :)
答案 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