Après quelques recherches, je suis arrivé à la conclusion que l'approche suivante me semble la meilleure.
certains / 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'])
Afin d'exécuter le example.groovy
script, ajoutez-le à votre chemin système et tapez à partir de n'importe quel répertoire:
example.groovy
Le script imprime:
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'exemple ci-dessus a été testé dans l'environnement suivant: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
L'exemple montre ce qui suit:
- Comment utiliser une
Util
classe dans un script groovy.
- Une
Util
classe appelant la Guava
bibliothèque tierce en l'incluant en tant que Grape
dépendance ( @Grab('com.google.guava:guava:23.0')
).
- La
Util
classe peut résider dans un sous-répertoire.
- Passer des arguments à une méthode dans la
Util
classe.
Commentaires / suggestions supplémentaires:
- Utilisez toujours une classe groovy au lieu d'un script groovy pour des fonctionnalités réutilisables dans vos scripts groovy. L'exemple ci-dessus utilise la classe Util définie dans le fichier Util.groovy. L'utilisation de scripts groovy pour des fonctionnalités réutilisables est problématique. Par exemple, si vous utilisez un script groovy, la classe Util devra être instanciée au bas du script avec
new Util()
, mais surtout, elle devra être placée dans un fichier nommé autre chose que Util.groovy. Reportez-vous à Scripts versus classes pour plus de détails sur les différences entre les scripts groovy et les classes groovy.
- Dans l'exemple ci-dessus, j'utilise le chemin
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
au lieu de "some/subpackage/Util.groovy"
. Cela garantira que le Util.groovy
fichier sera toujours trouvé par rapport à l'emplacement du script groovy ( example.groovy
) et non au répertoire de travail actuel. Par exemple, utiliser "some/subpackage/Util.groovy"
entraînerait une recherche sur WORK_DIR/some/subpackage/Util.groovy
.
- Suivez la convention de dénomination des classes Java pour nommer vos scripts groovy. Personnellement, je préfère une petite déviation où les scripts commencent par une lettre inférieure au lieu d'une majuscule. Par exemple,
myScript.groovy
est un nom de script et MyClass.groovy
est un nom de classe. La dénomination my-script.groovy
entraînera des erreurs d'exécution dans certains scénarios car la classe résultante n'aura pas de nom de classe Java valide.
- Dans le monde JVM en général, la fonctionnalité pertinente est appelée JSR 223: Scripting for the Java . Dans groovy en particulier, la fonctionnalité est appelée mécanismes d'intégration Groovy . En fait, la même approche peut être utilisée pour appeler n'importe quel langage JVM depuis Groovy ou Java. Quelques exemples notables de ces langages JVM sont Groovy, Java, Scala, JRuby et JavaScript (Rhino).