Ich habe gelesen, wie man einfach eine groovige Datei in ein anderes grooviges Skript importiert
Ich möchte allgemeine Funktionen in einer Groovy-Datei definieren und diese Funktionen aus anderen Groovy-Dateien aufrufen.
Ich verstehe, dass dies Groovy wie eine Skriptsprache verwenden würde, dh ich brauche keine Klassen / Objekte. Ich versuche so etwas wie dsl, das in groovy gemacht werden kann. Alle Variablen werden von Java aus aktiviert und ich möchte ein grooviges Skript in einer Shell ausführen.
Ist das überhaupt möglich? Kann jemand ein Beispiel geben.
Antworten:
Fügen Sie das oben in Ihr Skript ein. Dadurch wird der Inhalt einer groovigen Datei eingefügt (ersetzen Sie einfach den Dateinamen zwischen den doppelten Anführungszeichen durch Ihr grooviges Skript).
Ich mache das mit einer Klasse namens "Tools.groovy".
quelle
Ab Groovy 2.2 ist es möglich, eine Basisskriptklasse mit der neuen
@BaseScript
AST-Transformationsanmerkung zu deklarieren .Beispiel:
Datei MainScript.groovy :
Datei test.groovy :
quelle
Eine andere Möglichkeit, dies zu tun, besteht darin, die Funktionen in einer groovigen Klasse zu definieren und zu analysieren und die Datei zur Laufzeit dem Klassenpfad hinzuzufügen:
quelle
GroovyObject
explizit verwenden. Dies ist kein Platzhalter für Ihren eigenen Klassennamen.Ich denke, dass die beste Wahl darin besteht, Utility-Dinge in Form von groovigen Klassen zu organisieren, sie dem Klassenpfad hinzuzufügen und das Hauptskript über das Schlüsselwort import auf sie verweisen zu lassen.
Beispiel:
scripts / DbUtils.groovy
scripts / script1.groovy:
laufendes Skript:
quelle
lib
undsrc
Verzeichnisse habenDie Art und Weise, wie ich das mache, ist mit
GroovyShell
.quelle
Groovy hat kein Import-Schlüsselwort wie typische Skriptsprachen, mit denen der Inhalt einer anderen Datei wörtlich eingeschlossen wird (hier erwähnt: Bietet groovy einen Einschlussmechanismus? ).
Aufgrund seiner objekt- / klassenorientierten Natur muss man "Spiele spielen", damit solche Dinge funktionieren. Eine Möglichkeit besteht darin, alle Dienstprogrammfunktionen statisch zu machen (da Sie sagten, dass sie keine Objekte verwenden) und dann einen statischen Import im Kontext Ihrer ausführenden Shell durchzuführen. Dann können Sie diese Methoden wie "globale Funktionen" aufrufen.
Eine andere Möglichkeit wäre die Verwendung eines Bindungsobjekts ( http://groovy.codehaus.org/api/groovy/lang/Binding.html)), während Sie Ihre Shell erstellen und alle gewünschten Funktionen an die Methoden binden (der Nachteil hier wäre, dass Sie alle Methoden in der Bindung auflisten müssten, aber Sie könnten möglicherweise Reflection verwenden). Eine weitere Lösung wäre das Überschreiben
methodMissing(...)
des Ihrer Shell zugewiesenen Delegatenobjekts, mit dem Sie den dynamischen Versand grundsätzlich mithilfe einer Karte oder einer beliebigen Methode durchführen können.Einige dieser Methoden werden hier demonstriert: http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ . Lassen Sie mich wissen, wenn Sie ein Beispiel für eine bestimmte Technik sehen möchten.
quelle
Wie wäre es, das externe Skript als Java-Klasse zu behandeln? Basierend auf diesem Artikel: https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/
getThing.groovy Das externe Skript
printThing.groovy Das Hauptskript
Ergebnis
quelle
Hier ist ein vollständiges Beispiel für das Einfügen eines Skripts in ein anderes.
Führen Sie einfach die Datei Testmain.groovy aus.
Erklärende Kommentare enthalten, weil ich so nett bin;]
Testutils.groovy
Testmain.groovy
quelle
Für Spätankömmlinge scheint es, dass groovy jetzt den
:load file-path
Befehl unterstützt, der Eingaben aus der angegebenen Datei einfach umleitet. Daher ist es jetzt trivial, Bibliotheksskripte einzuschließen.Es funktioniert als Eingabe für den Groovysh & als Zeile in einer geladenen Datei:
groovy:000> :load file1.groovy
file1.groovy kann enthalten:
:load path/to/another/file invoke_fn_from_file();
quelle
:load file-path
?groovy:000> :load file1.groovy
file1.groovy kann enthalten: <br/>:load path/to/another/file
Eine Kombination aus @ grahamparks- und @ snindindy-Antworten mit einigen Änderungen hat für meine auf Tomcat ausgeführten Groovy-Skripte funktioniert:
Utils.groovy
MyScript.groovy:
quelle
Groovy kann andere Groovy-Klassen genau wie Java importieren. Stellen Sie nur sicher, dass die Erweiterung der Bibliotheksdatei .groovy lautet.
quelle
Nach einigen Untersuchungen bin ich zu dem Schluss gekommen, dass der folgende Ansatz der beste zu sein scheint.
some / subpackage / Util.groovy
example.groovy
Um das
example.groovy
Skript auszuführen , fügen Sie es Ihrem Systempfad hinzu und geben Sie es aus einem beliebigen Verzeichnis ein:Das Skript druckt:
Das obige Beispiel wurde in der folgenden Umgebung getestet:
Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
Das Beispiel zeigt Folgendes:
Util
Klasse in einem groovigen Skript.Util
Klasse, die dieGuava
Bibliothek eines Drittanbieters aufruft, indem sie sie alsGrape
Abhängigkeit (@Grab('com.google.guava:guava:23.0')
) einschließt .Util
Klasse kann sich in einem Unterverzeichnis befinden.Util
Klasse.Zusätzliche Kommentare / Vorschläge:
new Util()
Am wichtigsten ist jedoch, dass sie in einer Datei mit dem Namen "Util.groovy" abgelegt wird. Weitere Informationen zu den Unterschieden zwischen groovigen Skripten und groovigen Klassen finden Sie unter Skripte im Vergleich zu Klassen."${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
anstelle von"some/subpackage/Util.groovy"
. Dadurch wird sichergestellt, dass dieUtil.groovy
Datei immer in Bezug auf den Speicherort des groovigen Skripts (example.groovy
) und nicht auf das aktuelle Arbeitsverzeichnis gefunden wird. Zum Beispiel"some/subpackage/Util.groovy"
würde die Verwendung zu suchen beiWORK_DIR/some/subpackage/Util.groovy
.myScript.groovy
ein Skriptname undMyClass.groovy
ein Klassenname. Das Benennenmy-script.groovy
führt in bestimmten Szenarien zu Laufzeitfehlern, da die resultierende Klasse keinen gültigen Java-Klassennamen hat.quelle