Nach einigen Untersuchungen bin ich zu dem Schluss gekommen, dass der folgende Ansatz der beste zu sein scheint.
some / subpackage / Util.groovy
@GrabResolver(name = 'nexus', root = 'https://local-nexus-server:8443/repository/maven-public', m2Compatible = true)
@Grab('com.google.errorprone:error_prone_annotations:2.1.3')
@Grab('com.google.guava:guava:23.0')
@GrabExclude('com.google.errorprone:error_prone_annotations')
import com.google.common.base.Strings
class Util {
void msg(int a, String b, Map c) {
println 'Message printed by msg method inside Util.groovy'
println "Print 5 asterisks using the Guava dependency ${Strings.repeat("*", 5)}"
println "Arguments are a=$a, b=$b, c=$c"
}
}
example.groovy
#!/usr/bin/env groovy
Class clazz = new GroovyClassLoader().parseClass("${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy" as File)
GroovyObject u = clazz.newInstance()
u.msg(1, 'b', [a: 'b', c: 'd'])
Um das example.groovy
Skript auszuführen , fügen Sie es Ihrem Systempfad hinzu und geben Sie es aus einem beliebigen Verzeichnis ein:
example.groovy
Das Skript druckt:
Message printed by msg method inside Util.groovy
Print 5 asterisks using the Guava dependency *****
Arguments are a=1, b=b, c=[a:b, c:d]
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:
- So verwenden Sie eine
Util
Klasse in einem groovigen Skript.
- Eine
Util
Klasse, die die Guava
Bibliothek eines Drittanbieters aufruft, indem sie sie als Grape
Abhängigkeit ( @Grab('com.google.guava:guava:23.0')
) einschließt .
- Die
Util
Klasse kann sich in einem Unterverzeichnis befinden.
- Übergeben von Argumenten an eine Methode innerhalb der
Util
Klasse.
Zusätzliche Kommentare / Vorschläge:
- Verwenden Sie immer eine groovige Klasse anstelle eines groovigen Skripts, um wiederverwendbare Funktionen in Ihren groovigen Skripten zu erhalten. Im obigen Beispiel wird die in der Datei Util.groovy definierte Util-Klasse verwendet. Die Verwendung von groovigen Skripten für wiederverwendbare Funktionen ist problematisch. Wenn Sie beispielsweise ein grooviges Skript verwenden, muss die Util-Klasse am unteren Rand des Skripts mit instanziiert werden.
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.
- Im obigen Beispiel verwende ich den Pfad
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
anstelle von "some/subpackage/Util.groovy"
. Dadurch wird sichergestellt, dass die Util.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 bei WORK_DIR/some/subpackage/Util.groovy
.
- Befolgen Sie die Namenskonvention für Java-Klassen, um Ihre groovigen Skripte zu benennen. Ich persönlich bevorzuge eine kleine Abweichung, bei der die Skripte mit einem Kleinbuchstaben anstelle eines Großbuchstabens beginnen. Ist beispielsweise
myScript.groovy
ein Skriptname und MyClass.groovy
ein Klassenname. Das Benennen my-script.groovy
führt in bestimmten Szenarien zu Laufzeitfehlern, da die resultierende Klasse keinen gültigen Java-Klassennamen hat.
- In der JVM-Welt im Allgemeinen heißt die relevante Funktionalität JSR 223: Scripting für Java . Insbesondere bei Groovy wird die Funktionalität als Groovy-Integrationsmechanismen bezeichnet . Tatsächlich kann der gleiche Ansatz verwendet werden, um eine beliebige JVM-Sprache aus Groovy oder Java heraus aufzurufen . Einige bemerkenswerte Beispiele für solche JVM-Sprachen sind Groovy, Java, Scala, JRuby und JavaScript (Rhino).