J'essaie de créer un module d'extension, puis de l'utiliser dans un projet/script différent, mais je n'arrive pas à le faire fonctionner. Voici ce que je suis en train de faire:Impossible de faire fonctionner le module d'extension Groovy
Étape 1: Création d'un fichier nommé TemperatureUtils.groovy qui est une classe de type catégorie. Voici la source:
package utils
class TemperatureUtils {
Double toFahrenheit(Number celcius) {
(9 * celcius/5) + 32
}
Double toCelcius(Number fahrenheit) {
(fahrenheit - 32) * 5/9
}
}
Step-2: Créé le descripteur de module d'extension - org.codehaus.groovy.runtime.ExtensionModule avec le contenu suivant:
moduleName=Some-Utils
moduleVersion=1.0
extensionClasses=utils.TemperatureUtils
staticExtensionClasses=
Étape 3: Compilé la classe et créé manuellement un fichier jar avec la structure suivante:
extensionUtils.jar
|-- utils
| |-- TemperatureUtils.class
|
|-- META-INF
|-- services
|-- org.codehaus.groovy.runtime.ExtensionModule
Étape 4: Création d'un nouveau script pour utiliser le module d'extension. Source du script:
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)
Étape 5: exécution du script. Ici, je reçois l'exception suivante:
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)
Maintenant, je l'ai essayé quelques petites choses mais n'a pas pu le faire fonctionner:
- Suppression de la dernière ligne - « staticExtensionClasses = » du le descripteur de module d'extension mais cela n'a pas fonctionné.
- Modification de la classe TemperatureUtils.groovy en une catégorie réelle en utilisant l'annotation @Category (Number) et en supprimant les arguments des deux méthodes (et en utilisant 'this' au lieu des noms de paramètres 'celcius' et 'fahrenheit' dans les méthodes corps) mais cela n'a toujours pas fonctionné.
- Googled it, mais n'a pas trouvé beaucoup d'informations. Aussi tombé sur this, mais cela ne m'a pas aidé non plus.
Apprécierez toute aide que la merveilleuse communauté de stackoverflow peut vous offrir! :)