2

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! :)

Répondre

0

Ce qui fonctionne pour moi, en utilisant Groovy 2.4.5. Basé sur this post.

D'abord, changer TemperatureUtils d'avoir static méthodes:

package utils

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

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

Alors, je ne voudrais pas utiliser CompilerConfiguration mais simplement régler le CLASSPATH. Par exemple.

$ export CLASSPATH=../utils/build/libs/temp.jar 
$ groovy client.groovy 

Client.groovy est tout simplement:

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 shell = new GroovyShell() 
shell.evaluate(groovyScript)