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 principal src/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.
InformationsquelleAutor pvorb | 2012-11-06