我喜欢服务。我也喜欢模块系统。不幸的是,在我使用Java 9之前,我养成了通过URLClassLoader
在运行时从加载的jar获取服务提供程序的习惯,类似于这样(为了简洁起见,我将使用Java 10的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及以后的版本中也能正常工作,但它是在classpath上加载jar包,这意味着它使用旧的META-INF\services
方法查找服务提供者。我更愿意使用module-info
方法,但这需要将jar包加载到模块路径上,但我找不到任何方法来做到这一点。所以我在这里,希望有人能告诉我如何实现这一点(如果有这样的情况的话)或者告诉我不可能。