J'ai lu comment importer simplement un fichier groovy dans un autre script groovy
Je veux définir des fonctions communes dans un fichier groovy et appeler ces fonctions à partir d'autres fichiers groovy.
Je comprends que cela utiliserait Groovy comme un langage de script, c'est-à-dire que je n'ai pas besoin de classes / objets. J'essaye quelque chose comme le DSL qui peut être fait dans groovy. Toutes les variables seront affirmées à partir de Java et je veux exécuter un script groovy dans un shell.
Est-ce possible ? Quelqu'un peut-il donner un exemple.
Réponses:
Mettez cela en haut de votre script. Cela apportera le contenu d'un fichier groovy (remplacez simplement le nom du fichier entre les guillemets doubles par votre script groovy).
Je fais cela avec une classe appelée étonnamment "Tools.groovy".
la source
Depuis Groovy 2.2, il est possible de déclarer une classe de script de base avec la nouvelle
@BaseScript
annotation de transformation AST.Exemple:
fichier MainScript.groovy :
fichier test.groovy :
la source
Une autre façon de faire est de définir les fonctions dans une classe groovy et d'analyser et d'ajouter le fichier au chemin de classe au moment de l'exécution:
la source
GroovyObject
explicitement, ce n'est pas un espace réservé pour votre propre nom de classe.Je pense que le meilleur choix est d'organiser les choses utilitaires sous forme de classes groovy, de les ajouter au classpath et de laisser le script principal s'y référer via un mot-clé d'importation.
Exemple:
scripts / DbUtils.groovy
scripts / script1.groovy:
script en cours d'exécution:
la source
lib
et lessrc
répertoiresLa façon dont je fais cela est avec
GroovyShell
.la source
Groovy n'a pas de mot-clé d'importation comme les langages de script typiques qui feront une inclusion littérale du contenu d'un autre fichier (auquel il est fait allusion ici: Groovy fournit-il un mécanisme d'inclusion? ).
En raison de sa nature orientée objet / classe, vous devez «jouer à des jeux» pour faire fonctionner des choses comme celles-ci. Une possibilité est de rendre toutes vos fonctions utilitaires statiques (puisque vous avez dit qu'elles n'utilisent pas d'objets) et ensuite d'effectuer une importation statique dans le contexte de votre shell en cours d'exécution. Ensuite, vous pouvez appeler ces méthodes comme "fonctions globales".
Une autre possibilité serait d'utiliser un objet Binding ( http://groovy.codehaus.org/api/groovy/lang/Binding.html) lors de la création de votre Shell et de la liaison de toutes les fonctions que vous souhaitez aux méthodes (l'inconvénient ici serait de devoir énumérer toutes les méthodes de la liaison, mais vous pourriez peut-être utiliser la réflexion). Une autre solution serait de remplacer
methodMissing(...)
l'objet délégué attribué à votre shell, ce qui vous permet essentiellement de faire une répartition dynamique à l'aide d'une carte ou de la méthode de votre choix.Plusieurs de ces méthodes sont présentées ici: http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ . Faites-moi savoir si vous souhaitez voir un exemple d'une technique particulière.
la source
Que diriez-vous de traiter le script externe comme une classe Java? Basé sur cet article: https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/
getThing.groovy Le script externe
printThing.groovy Le script principal
Résultat
la source
Voici un exemple complet d'inclusion d'un script dans un autre.
Il suffit de lancer le fichier Testmain.groovy.
Commentaires explicatifs inclus car je suis gentil comme ça;]
Testutils.groovy
Testmain.groovy
la source
Pour les retardataires, il semble que groovy supporte désormais la
:load file-path
commande qui redirige simplement l'entrée du fichier donné, il est donc désormais trivial d'inclure des scripts de bibliothèque.Cela fonctionne comme une entrée dans le groovysh et comme une ligne dans un fichier chargé:
groovy:000> :load file1.groovy
file1.groovy peut contenir:
:load path/to/another/file invoke_fn_from_file();
la source
:load file-path
?groovy:000> :load file1.groovy
file1.groovy peut contenir: <br/>:load path/to/another/file
Une combinaison de réponses @grahamparks et @snowindy avec quelques modifications est ce qui a fonctionné pour mes scripts Groovy fonctionnant sur Tomcat:
Utils.groovy
MyScript.groovy:
la source
Groovy peut importer d'autres classes groovy exactement comme le fait Java. Assurez-vous simplement que l'extension du fichier de bibliothèque est .groovy.
la source
Après quelques recherches, je suis arrivé à la conclusion que l'approche suivante me semble la meilleure.
certains / subpackage / Util.groovy
example.groovy
Afin d'exécuter le
example.groovy
script, ajoutez-le à votre chemin système et tapez à partir de n'importe quel répertoire:Le script imprime:
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:
Util
classe dans un script groovy.Util
classe appelant laGuava
bibliothèque tierce en l'incluant en tant queGrape
dépendance (@Grab('com.google.guava:guava:23.0')
).Util
classe peut résider dans un sous-répertoire.Util
classe.Commentaires / suggestions supplémentaires:
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."${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
au lieu de"some/subpackage/Util.groovy"
. Cela garantira que leUtil.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 surWORK_DIR/some/subpackage/Util.groovy
.myScript.groovy
est un nom de script etMyClass.groovy
est un nom de classe. La dénominationmy-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.la source