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.groovyscript, 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
Utilclasse dans un script groovy.
- Une
Utilclasse appelant la Guavabibliothèque tierce en l'incluant en tant que Grapedépendance ( @Grab('com.google.guava:guava:23.0')).
- La
Utilclasse peut résider dans un sous-répertoire.
- Passer des arguments à une méthode dans la
Utilclasse.
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.groovyfichier 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.groovyest un nom de script et MyClass.groovyest un nom de classe. La dénomination my-script.groovyentraî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).