Мне нравятся услуги. Мне также нравится модульная система. К сожалению для меня, до того, как я использовал Java 9, я привык получать поставщиков услуг из jar-файлов, загружаемых во время выполнения через URLClassLoader
, что-то вроде этого (для краткости я буду использовать Java 10's var
):
var url = new File("myjar.jar").toURI().toURL();
var cl = new URLClassLoader(new URL[] {url}, getClass().getClassLoader());
var services = ServiceLoader.load(MyService.class, cl);
for (var service : services) {
...
}
Это прекрасно работает, даже в Java 9 и более поздних версиях, но загружает jar в classpath, что означает, что он использует старый метод META-INF\services
для поиска поставщиков услуг. Я бы предпочел использовать метод module-info
, но для этого требуется, чтобы вместо файла jar загружался путь к модулю, но я не мог найти какой-либо способ сделать это. Итак, я надеюсь, что кто-то здесь, кто лучше разбирается в модульной системе, расскажет мне, как это можно сделать (или нет, если это так).