我的结构由一个使用 Java util 服务加载器加载插件的主应用程序组成。在加载服务提供者 JAR 之后,主应用程序的服务提供者会尝试加载他们自己的服务提供者。然而,他们无法做到这一点,因为类加载器上下文是主应用程序的上下文。这意味着类加载器不知道服务提供者使用的接口试图加载他们自己的服务提供者导致类未找到异常。任何人都可以建议我的服务提供商如何使用服务加载器加载他们自己的服务提供商吗?有没有办法在运行时动态更改类加载器上下文?我稍后会尝试发布一些代码。我目前远离代码所在的笔记本电脑。谢谢你。
问问题
324 次
2 回答
2
我假设您使用 ServiceLoader.load(Class service) 来加载插件?如果是,它使用当前线程的类加载器(Thread.currentThread().getContextClassLoader())。
因此,请尝试使用此方法的重载版本,您可以在其中注入不同的类加载器:
ServiceLoader<S> load(Class<S> service, ClassLoader loader)
于 2014-02-12T10:55:44.763 回答
0
好吧,我使用上面提到的重载方法让它工作。唯一的区别是我使用了 load(Class service, Plugin.class.getClassLoader() );。Thread.currentThread().getContextClassLoader() 仍然返回主应用程序的类加载器
于 2014-02-13T07:23:20.167 回答