Я хочу загрузить и перезагрузить поставщика услуг в банке, которая является модулем. Насколько я понимаю, это может быть достигнуто путем загрузки модуля в новый ModuleLayer
.
Следуя совету в этом ответе и примере в документах , мне удалось загрузить модуль во время выполнения и использовать поставщика услуг.
var finder = ModuleFinder.of(Path.of("/path/to/module/"));
var bootLayer = ModuleLayer.boot();
var pluginLayer = bootLayer.defineModulesWithOneLoader(
bootLayer.configuration().resolve(finder, ModuleFinder.of(), Set.of("myapp")),
ClassLoader.getSystemClassLoader());
ServiceLoader.load(MyService.class, pluginLayer.findLoader("myapp"))
.findFirst()
.ifPresentOrElse(
__ -> System.out.println("Found provider."),
() -> System.out.println("Couldn't find provider."));
Единственное, в чем я не уверен, так это в том, как мне в конечном итоге выгрузить модуль и перезагрузить его новую версию. Связанный ответ говорит о том, что выгрузка происходит, когда ModuleLayer
является GC'd. После некоторого тестирования я подтвердил это, хотя это кажется очень привередливым. Очевидно, что я не могу точно определить, когда слой будет собирать мусор, даже если он недоступен.
Каков наилучший подход для обеспечения быстрой перезагрузки модуля?