Chciałem zbudować moduł wtyczki, który może być ładowany z ServiceLoader
. Wymaga to dodania pliku do katalogu META-INF/services
, nazwanego po interfejsie usługi i zawierającego ścieżkę kwalifikacyjną do klasy, która ją implementuje. Następnie możesz załadować te usługi, dzwoniąc pod numer ServiceLoader.load()
.META-INF/usługi w JAR z Gradle
Oto przykład:
że chcemy zapewnić interfejs wtyczki o nazwie org.example.plugins.PluginService
. Następnie zapewniamy implementację tej usługi w klasie org.example.plugins.impl.ExamplePlugin
.
Jeśli chcemy mieć jakiś mechanizm wtyczek, możemy stworzyć plik JAR zawierający implementację. Ten plik JAR musi również zawierać plik META-INF/services/org.example.plugins.PluginService
. Plik ten musi zawierać jedną linię: , aby umożliwić ServiceLoader
znalezienie implementacji. Jeśli plik JAR jest na ścieżce kompilacji można załadować wtyczki wywołując
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
To iterator da Ci dostęp too wszystkie wtyczki, które są znalezione przez ServiceLoader
.
Z jakiegoś powodu Gradle domyślnie nie umieszcza plików w katalogu META-INF
. Czy istnieje sposób, aby wynikowy plik JAR zawierał taki plik?
Już znalazłem metodę metaInf
w klasie Jar
. Ale nie wiem, że jest wystarczająco dobry, aby znaleźć rozwiązanie na własną rękę.
Czy jesteś pewien? Działa dobrze dla mnie. Gdzie dokładnie umieścisz ten plik i jak wygląda twój 'build.gradle'? – axtavt
Istnieje katalog 'META-INF' w głównym folderze źródłowym' src/main/java'. Nie ma nic specjalnego w skrypcie budowania. Jest prawie standardowy, zawiera pewne dodatkowe zależności i niektóre niestandardowe repozytoria. – pvorb