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.groovyscript, 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
Utilclasse che chiama la Guavalibreria di terze parti includendola come Grapedipendenza ( @Grab('com.google.guava:guava:23.0')).
- La
Utilclasse può risiedere in una sottodirectory.
- Passaggio di argomenti a un metodo all'interno della
Utilclasse.
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.groovyfile 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.groovycomporterà 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).