La forma de ampliar la ruta del módulo en tiempo de ejecución

Anónimo:

Me gustan los servicios. También me gusta el sistema de módulos. Por desgracia para mí, antes de que yo solía Java 9 llegué en el hábito de los proveedores de servicios de frascos cargados en tiempo de ejecución a través URLClassLoader, algo como esto (Voy a usar Java 10 de varpor razones de brevedad):

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) {
  ...
}

Esto funciona bien, incluso en Java 9 y más allá, pero carga el tarro en la ruta de clase, lo que significa que utiliza el antiguo META-INF\servicesmétodo para encontrar proveedores de servicios. Prefiero usar el module-infométodo, sino que requiere el frasco para ser cargado en la ruta del módulo en su lugar, pero no pude encontrar ninguna manera yo podría ir haciendo eso. Así que aquí estoy, esperando que alguien aquí que entienda el sistema de módulos más a fondo me dirá cómo esto se puede hacer (o que no se puede, si es el caso).

Holger:

El ejemplo de trabajo más pequeño, pude montar, es

var path = Path.of("myjar.jar");
var cl = new URLClassLoader(new URL[]{path.toUri().toURL()});
var mf = ModuleFinder.of(path);
var cfg = Configuration.resolve(mf, List.of(ModuleLayer.boot().configuration()), mf, Set.of());
var ml = ModuleLayer.defineModulesWithOneLoader(cfg, List.of(ModuleLayer.boot()), cl).layer();
var services = ServiceLoader.load(ml, MyService.class);
services.forEach(System.out::println);

Asumiendo que myjar.jares un frasco modular declarar para proporcionar MyServiceimplementaciones.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=187161&siteId=1
Recomendado
Clasificación