54 votes

Comment inclure des jars dans un script groovy ?

J'ai un groovy script qui a besoin d'une bibliothèque dans un jar. Comment puis-je l'ajouter au classpath ? Je veux que le script soit exécutable donc j'utilise #!/usr/bin/env groovy en haut de mon script.

2 votes

Il semble que cette question ait déjà été posée : stackoverflow.com/questions/254385/

0 votes

Comme indiqué dans les réponses ci-dessous, il est préférable d'utiliser #!/bin/sh et ensuite appeler groovy avec les arguments que vous voulez. Le minimum serait #!/bin/sh\n groovy -cp PATH-OR-JAR $@ pour passer tous les arguments passés sur la ligne de commande à la commande groovy. Sous Windows, ce serait groovy -cp PATH %*

57voto

Patrick Points 1664

Démarrer un script groovy avec #!/usr/bin/env groovy a une limitation très importante - Aucun argument supplémentaire ne peut être ajouté. Aucun classpath ne peut être configuré, pas d'exécution de groovy avec defines ou en debug. Ce n'est pas un groovy mais une limitation dans la façon dont le shebang ( #! ) fonctionne - tous les arguments supplémentaires sont traités comme un seul argument, donc #!/usr/bin/env groovy -d dit /usr/bin/env pour exécuter la commande groovy -d rathen alors groovy avec un argument de d .

Il existe une solution de contournement pour ce problème, qui consiste à démarrer groovy avec bash. dans le groovy script.

#!/bin/bash                                                                                                                                                                 
//usr/bin/env groovy  -cp extra.jar:spring.jar:etc.jar -d -Dlog4j.configuration=file:/etc/myapp/log4j.xml "$0" $@; exit $?

import org.springframework.class.from.jar
//other groovy code
println 'Hello'

Toute la magie se produit dans les deux premières lignes. La première ligne nous dit que c'est un bash script. bash commence à courir et voit la première ligne. Sur bash # est destiné aux commentaires et // est réduit à / qui est le répertoire racine. Donc bash fonctionnera /usr/bin/env groovy -cp extra.jar:spring.jar:etc.jar -d -Dlog4j.configuration=file:/etc/myapp/log4j.xml "$0" $@ qui lance groovy avec tous les arguments souhaités. Le site "$0" est le chemin vers notre script, et $@ sont les arguments. Maintenant groovy s'exécute et il ignore les deux premières lignes et voit notre groovy script et ensuite retourne à bash . bash puis sort ( exit $?1 ) avec le code d'état de groovy.

0 votes

Cela peut-il être fait avec un fichier batch de Windows ?

2 votes

Bonne astuce - bien qu'elle ne semble pas fonctionner dans un shell Cygwin Windows, car la double barre oblique dans //usr/bin/env n'est pas rabattue.

4 votes

Sous Linux (BSD a besoin de plus de logique pour faire readlink -f), ce qui suit sélectionne le chemin scripts actuel et l'inclut dans le classpath. // 2>/dev/null; SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"; exec groovy -cp "$SCRIPT_DIR" "$0"

38voto

Eric Wendelin Points 13805

Si vous devez vraiment le faire, vous pouvez également charger un JAR au moment de l'exécution avec :

this.getClass().classLoader.rootLoader.addURL(new File("file.jar").toURL())

0 votes

Heh, j'ai définitivement raté la section "Adding things to the classpath" la première fois que j'ai lu ça.

1 votes

Je n'ai pas réussi à faire fonctionner ce classloader... quelqu'un d'autre a-t-il pu l'utiliser ?

4 votes

Il y a des limitations qui ne sont pas couvertes dans la documentation quand on fonctionne avec un shebang(# !). Je les ai expliquées plus en détail en bas . @Zombies, la technique du classloader ne fonctionne que si vous n'avez pas besoin d'importer des classes depuis ce .jar. Les importations sont résolues avant l'exécution du script et l'importation du .jar.

25voto

Spina Points 2769

Ma façon préférée de le faire est avec des raisins Groovy. Ceux-ci accèdent au dépôt central Maven, téléchargent le jar référencé, puis le placent dans le classpath. Vous pouvez alors utiliser la bibliothèque comme n'importe quelle autre bibliothèque. La syntaxe est très simple :

@Grab(group='com.google.collections', module='google-collections', version='1.0')

Vous pouvez lire plus de détails aquí . Un avantage majeur ici est que vous n'avez pas besoin de distribuer vos dépendances lorsque vous distribuez votre script. Le seul inconvénient de cette méthode est que la Jar doit se trouver dans le dépôt Maven.

0 votes

Lien brisé pour ici

24voto

Ove S Points 936

Vous pouvez ajouter les jars à $HOME/.groovy/lib

0 votes

Fonctionne pour moi (utilisant Groovy 2.1.2 avec Windows 7)

0 votes

C'est très bien, sauf lorsque vous exécutez tellement de processus Groovy que vous épuisez votre limite de fichiers ouverts.

10voto

Bob Herrmann Points 1653

Vous pouvez également essayer Groovy Grape. Il vous permet d'utiliser des annotations pour modifier le classpath. C'est expérimental pour l'instant, mais plutôt cool. Voir docs.groovy-lang.org/.../grape

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X