Dopo alcune indagini sono giunto alla conclusione che il seguente approccio sembra il migliore.
alcuni / 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"
}
}
esempio.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'])
Per eseguire lo example.groovy
script, aggiungilo al percorso di sistema e digita da qualsiasi directory:
example.groovy
Lo script stampa:
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]
L'esempio precedente è stato testato nel seguente ambiente: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
L'esempio mostra quanto segue:
- Come utilizzare un file
Util
classe all'interno di uno script groovy.
- Una
Util
classe che chiama la Guava
libreria di terze parti includendola come Grape
dipendenza ( @Grab('com.google.guava:guava:23.0')
).
- La
Util
classe può risiedere in una sottodirectory.
- Passaggio di argomenti a un metodo all'interno della
Util
classe.
Commenti / suggerimenti aggiuntivi:
- Usa sempre una classe groovy invece di script groovy per funzionalità riutilizzabili all'interno dei tuoi script groovy. L'esempio precedente utilizza la classe Util definita nel file Util.groovy. L'utilizzo di script groovy per funzionalità riutilizzabili è problematico. Ad esempio, se si utilizza uno script groovy, la classe Util dovrebbe essere istanziata nella parte inferiore dello script con
new Util()
, ma soprattutto dovrebbe essere collocata in un file denominato in modo diverso da Util.groovy. Fare riferimento a Script e classi per maggiori dettagli sulle differenze tra script groovy e classi groovy.
- Nell'esempio sopra, utilizzo il percorso
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
invece di "some/subpackage/Util.groovy"
. Ciò garantirà che il Util.groovy
file verrà sempre trovato in relazione alla posizione dello script groovy ( example.groovy
) e non alla directory di lavoro corrente. Ad esempio, l'utilizzo "some/subpackage/Util.groovy"
comporterebbe la ricerca in WORK_DIR/some/subpackage/Util.groovy
.
- Segui la convenzione di denominazione delle classi Java per assegnare un nome ai tuoi fantastici script. Personalmente preferisco una piccola deviazione in cui gli script iniziano con una lettera minuscola invece di una maiuscola. Ad esempio,
myScript.groovy
è un nome di script ed MyClass.groovy
è un nome di classe. La denominazione my-script.groovy
comporterà errori di runtime in determinati scenari poiché la classe risultante non avrà un nome di classe Java valido.
- Nel mondo JVM in generale la funzionalità rilevante è denominata JSR 223: Scripting for the Java . In groovy in particolare la funzionalità è chiamata meccanismi di integrazione Groovy . In effetti, lo stesso approccio può essere utilizzato per chiamare qualsiasi linguaggio JVM da Groovy o Java. Alcuni esempi notevoli di tali linguaggi JVM sono Groovy, Java, Scala, JRuby e JavaScript (Rhino).