2017-02-10 3 views
2

Ich habe gerade angefangen groovig zu lernen und versuche meinen Java Code in groovige Skripte zu transponieren. Normalerweise ermöglicht Java, dass Sie eine Klasse mit nur Methoden haben, die Sie von anderen Klassen aufrufen können. Ich wollte das zu groovy übersetzen. Ich in einer Datei haben - nennen wir es eine Methode, wie diese File1-:Methoden zwischen groovigen Skripten mit korrekten Parametern aufrufen

def retrieveData(String name){ 
// do something 
} 

und in der zweiten Datei, File2, ich nenne File1 wie folgt aus:

def file1Class = this.class.classLoader.parseClass(new File("../File1.groovy")) 

und dann versuchen, die anrufen Verfahren in File1 wie folgt aus:

def data = file1Class.retrieveData("String") 

aber es hält mich diesen Fehler geben - Missing:

groovy.lang.MissingMethodException: No signature of method: static File1.retrieveData() is applicable for argument types: (java.lang.String) values: [String] Possible solutions: retrieveData(java.lang.String) 

so erkennt es, dass ich die richtige Anzahl von Parametern und sogar das richtige Objekt sende, aber es läuft nicht die Methode, wie es sollte? Gibt es etwas, das mir fehlt? Ich habe versucht, die Objektdefinition aus dem Verfahren zu entfernen - mit anderen Worten - wie folgt aus:

def retrieveData(name){ 
// do something 
} 

aber das hat nicht funktioniert entweder. Ich habe keine Ahnung, was der nächste Schritt sein würde. Kann mir bitte jemand helfen, mich in die richtige Richtung zu schieben? Ich würde es sehr begrüßen.

Antwort

0

Siehe die Antwort in this StackOverflow reponse.

Verwenden Sie die GroovyScriptEngineclass. Was macht die GroovyScriptEngine? Aus der Dokumentation:

Spezifische Skript-Engine, die modifizierte Skripte neu laden kann, sowie , die sich mit abhängigen Skripten richtig befassen.

Siehe das Beispiel unten.

def script = new GroovyScriptEngine('.').with { 
    loadScriptByName('..\File1.groovy') 
} 
this.metaClass.mixin script 

retrieveData() 

Hinweis, wie wir die loadScriptByName Methode

verwenden Holen Sie die Klasse des script in Frage, so dass Sie Groovy Objekte mit Caching und Nachladen instanziieren.

Dies ermöglicht Ihnen den Zugriff auf Groovy-Objekte aus Dateien, wie Sie möchten.

+0

Ich habe das versucht, aber es ignoriert den Klassenpfad vollständig. Ich habe notwendige JAR-Dateien in den ext-Ordner geschrieben, damit die soapUI darauf zugreifen kann, und zwar mit der Methode, auf die ich in der Frage Bezug genommen habe, aber wenn ich das tue, löst sie eine MultipleCompilationErrorsException aus: Klasse HSSFCell kann nicht aufgelöst werden – droidnoob

+0

Versuchen Sie, ein Verzeichnis aufzurufen? Wenn ja, [lesen Sie diese Antwort] (http://stackoverflow.com/questions/15565961/groovyscriptengine-load-groovy-scripts-from-subfolder#15566768), die das Laden von einem Unterordner beschreibt. Wenn Sie Ressourcen aufrufen, die durch einen relativen Pfad definiert sind, müssen Sie beim Wechseln zwischen groovigen Klassen besondere Vorsicht walten lassen. – Nathan

+0

Das File1.groovy und das XML, das das File2.groovy enthält, befinden sich beide in dem Ordner Dokumente. Ja, ich musste das loadScript by Name folgendermaßen bearbeiten: 'loadScriptByName ('../../../../Users/myname/Documents/File1.groovy ') 'aber die JAR-Dateien sollten in den SOAPUI_HOME/bin/ext-Ordner gehen. Warum also wird es das nicht sehen? beim Lesen von File1.groovy? – droidnoob

Verwandte Themen