Я хотел создать модуль плагина, который можно загрузить с помощью ServiceLoader
. Для этого требуется добавить файл в каталог META-INF/services
, названный в честь интерфейса службы, и который содержит квалификационный путь к классу, который его реализует. Затем вы можете загрузить эти службы, вызвав ServiceLoader.load()
.
Вот пример:
Предположим, что мы хотим предоставить интерфейс плагина org.example.plugins.PluginService
. Затем мы предоставляем реализацию этой службы в классе org.example.plugins.impl.ExamplePlugin
.
Если мы хотим иметь какой-то механизм плагинов, мы могли бы создать JAR файл, содержащий реализацию. Этот JAR файл также должен содержать файл META-INF/services/org.example.plugins.PluginService
. Этот файл должен содержать одну строку
org.example.plugins.impl.ExamplePlugin
чтобы включить ServiceLoader
для поиска реализации. Если этот файл JAR находится в пути сборки, вы можете загрузить плагин, вызвав
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
Этот итератор предоставит вам доступ ко всем плагинам, которые находятся в ServiceLoader
.
По какой-то причине Gradle по умолчанию не включает файлы в каталог META-INF
. Есть ли способ дать результирующему JAR такой файл?
Я уже нашел метод metaInf
в классе Jar
. Но я не знаю groovy достаточно хорошо, чтобы найти решение самостоятельно.