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.groovySkript 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
UtilKlasse in einem groovigen Skript.
- Eine
UtilKlasse, die die GuavaBibliothek eines Drittanbieters aufruft, indem sie sie als GrapeAbhängigkeit ( @Grab('com.google.guava:guava:23.0')) einschließt .
- Die
UtilKlasse kann sich in einem Unterverzeichnis befinden.
- Übergeben von Argumenten an eine Methode innerhalb der
UtilKlasse.
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.groovyDatei 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.groovyein Skriptname und MyClass.groovyein Klassenname. Das Benennen my-script.groovyfü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).