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