META-INF/services dans le BOCAL avec Gradle
Je voulais construire un module plugin qui peut être chargé avec un ServiceLoader
. Cela nécessite l'ajout d'un fichier à l' META-INF/services
répertoire, qui est nommé d'après l'interface de service et qui contient la qualification de chemin d'accès à la classe qui l'implémente. Ensuite, vous pouvez charger ces services en appelant ServiceLoader.load()
.
Voici un exemple:
Dire que nous voulons vous fournir une interface plugin appelé org.example.plugins.PluginService
. Nous proposons ensuite une mise en œuvre de ce service dans la classe org.example.plugins.impl.ExamplePlugin
.
Si nous voulons avoir une sorte de mécanisme de plugin, on pourrait créer un fichier JAR qui contient la mise en œuvre. Ce fichier JAR doit également contenir le fichier META-INF/services/org.example.plugins.PluginService
. Ce fichier doit contenir une ligne
org.example.plugins.impl.ExamplePlugin
pour permettre à l' ServiceLoader
pour trouver la mise en œuvre. Si ce fichier JAR est dans le build path, vous pouvez charger le plugin en appelant
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
Que itérateur vous donne accès à tous les plugins qui sont trouvés par le ServiceLoader
.
Pour quelque raison Gradle ne pas inclure les fichiers dans le META-INF
répertoire par défaut. Est-il un moyen de laisser le résultant POT de contenir un tel fichier?
J'ai déjà trouvé la méthode metaInf
dans la classe Jar
. Mais je ne sais pas groovy assez bon pour trouver la solution à mon propre compte.
- Êtes-vous sûr? Fonctionne très bien pour moi. Exactement où vous placez ce fichier et comment vos
build.gradle
look? - Il y a un
META-INF
répertoire dans le dossier source principalsrc/main/java
. Il n'y a rien de spécial avec le script de construction. C'est presque un standard, contenant des dépendances supplémentaires et quelques dépôts.
Vous devez vous connecter pour publier un commentaire.
Vous placez
META-INF/services/org.example.plugins.PluginService
danssrc/main/java
, mais ce n'est pas une source, c'est un fichier de ressources, donc il doit être placé dans le dossier de ressources en fonction de Maven répertoire disposition de la convention, c'est-àDans ce cas, tout devrait fonctionner hors de la boîte.
En attendant j'ai trouvé une solution à mon problème (un peu) Question similaire.
Adjonction, à la
gradle.build
fichier, résout mon problèmeMaintenant le fichier JAR regarde comme prévu
build.gradle
.J'espère qu'ils vont mettre en œuvre ce dans le pot de tâches comme la fourmi n'. Quelqu'un a déjà travaillé sur elle: http://fgaliegue.blogspot.fr/2013/06/gradle-serviceloader-support.html
Si vous héritez d'une fourmi en fonction de l'héritage de code qui ne respecte pas les conventions de maven, le suivant peut aider.
Définir votre source de jeux de match de l'héritage de la structure, et d'inclure une ligne comme ceci:
include 'META-INF/services/**'
Dans votre source de jeux. Ce modèle est générique et se ramasser tous vos meta-inf services.
Exemple complet ci-dessous.
Hi Pouvez essayer ceci: https://plugins.gradle.org/plugin/com.github.harbby.gradle.serviceloader
Utilisation