2

Ich versuche, ein Erweiterungsmodul zu erstellen und es dann in einem anderen Projekt/Skript zu verwenden, aber es nicht zum Funktionieren zu bringen. Hier ist, was ich tue:Groovy-Erweiterungsmodul kann nicht funktionieren

Schritt-1: Erstellt eine Datei mit dem Namen TemperatureUtils.groovy, die eine Kategorie-ähnliche Klasse ist. Hier ist die Quelle:

package utils 

class TemperatureUtils { 

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

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

Schritt-2: Erstellt das Erweiterungsmodul Descriptor - org.codehaus.groovy.runtime.ExtensionModule mit folgendem Inhalt:

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

Step-3: Zusammengestellt der Klasse und hand-created eine jar-Datei mit der folgenden Struktur:

Schritt-4: Erstellt ein neues Skript für die Verwendung des Erweiterungsmoduls. Skriptquelle:

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) 

Schritt-5: Skript ausgeführt. Hier bin ich die folgende Ausnahme erhalten:

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) 

Jetzt habe ich ein paar Dinge ausprobiert, aber konnte es nicht arbeiten:

  • entfernt die letzte Zeile - „staticExtensionClasses =“ von der Erweiterungsmodul Deskriptor, aber es hat nicht funktioniert.
  • Die TemperatureUtils.groovy-Klasse wurde zu einer tatsächlichen Kategorie geändert, indem die Annotation @Category (Number) verwendet und die Argumente beider Methoden entfernt wurden (und 'them' anstelle von 'celcius' und 'fahrenheit' in Methoden verwendet wurde) "Körper), aber es hat immer noch nicht funktioniert.
  • Google hat es gegoogelt aber nicht viele Informationen gefunden. Stolperte auch über this, aber das half mir auch nicht.

Würde mich über jede Hilfe freuen, die die wunderbare stackoverflow Community bieten kann! :)

Antwort

0

Das folgende funktioniert für mich, mit Groovy 2.4.5. Basiert auf this post.

Zuerst TemperatureUtils ändern static Methoden haben:

Paket utils

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

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

Dann würde ich nicht CompilerConfiguration verwenden, sondern einfach die CLASSPATH gesetzt. Z.B.

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

wo Client.groovy einfach ist:

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)