使用服务加载器加载的Java服务使用服务加载器加载它们自己的服务

使用服务加载器加载的Java服务使用服务加载器加载它们自己的服务,java,service-provider,Java,Service Provider,我的结构由一个主应用程序组成,该应用程序使用JavaUtil服务加载器加载插件。加载服务提供者JAR后,主应用程序的服务提供者尝试加载自己的服务提供者。但是,它们无法实现这一点,因为类装入器上下文是主应用程序的上下文。这意味着类加载器不知道服务提供者试图加载自己的服务提供者所使用的接口,从而导致类未找到异常。有人能建议我的服务提供商如何使用服务加载器加载他们自己的服务提供商吗?有没有办法在运行时动态更改类加载器上下文?稍后我将尝试发布一些代码。我目前不在代码所在的笔记本电脑旁。多谢各位 我假设您

我的结构由一个主应用程序组成,该应用程序使用JavaUtil服务加载器加载插件。加载服务提供者JAR后,主应用程序的服务提供者尝试加载自己的服务提供者。但是,它们无法实现这一点,因为类装入器上下文是主应用程序的上下文。这意味着类加载器不知道服务提供者试图加载自己的服务提供者所使用的接口,从而导致类未找到异常。有人能建议我的服务提供商如何使用服务加载器加载他们自己的服务提供商吗?有没有办法在运行时动态更改类加载器上下文?稍后我将尝试发布一些代码。我目前不在代码所在的笔记本电脑旁。多谢各位

我假设您使用ServiceLoader.load(类服务)来加载插件?如果是,则使用当前线程的类加载器(thread.currentThread().getContextClassLoader())

因此,尝试使用此方法的重载版本,您可以在其中注入不同的类加载器:

ServiceLoader<S> load(Class<S> service, ClassLoader loader)
ServiceLoader加载(类服务,类加载程序)

我使用上面提到的重载方法实现了它。唯一的区别是我使用了load(类服务,Plugin.Class.getClassLoader());。Thread.currentThread().getContextClassLoader()仍然返回主应用程序的类加载器

是的,我确实使用ServiceLoader。我尝试了Thread.currentThread().getContextClassLoader(),但它仍然返回主应用程序的类加载器。我使用上面提到的重载方法使它工作。唯一的区别是我使用了load(类服务,Plugin.Class.getClassLoader());。Thread.currentThread().getContextClassLoader()仍然返回主应用程序的类加载器+1对于重载方法提示:)