2014-02-12 124 views
1

我的结构由一个使用Java util服务加载器加载插件的主应用程序组成。在加载服务提供者JAR之后,主应用程序的服务提供者尝试加载他们自己的服务提供者。但是他们不能完成这个,因为类加载器上下文是主应用程序的上下文。这意味着类加载器不知道尝试加载自己的服务提供程序的服务提供程序所使用的接口,从而导致类未找到异常。任何人都可以建议我的服务提供商如何使用服务加载器加载自己的服务提供者?有没有办法在运行时动态更改类加载器上下文?我会稍后尝试发布一些代码。我目前远离我的笔记本电脑的代码位于。谢谢。加载服务加载器的Java服务通过服务加载器加载他们自己的服务

回答

0

嗯,我得到了它使用重载方法,上述工作。唯一的区别是我用load(Class service,Plugin.class.getClassLoader());. Thread.currentThread()。getContextClassLoader()仍然返回主应用程序的类加载器

1

我假设你使用ServiceLoader.load(Class service)加载插件?如果是,它使用当前线程的类加载器(Thread.currentThread()。getContextClassLoader())。

因此尝试使用这种方法,你可以注入不同的类加载器的重载版本:

ServiceLoader<S> load(Class<S> service, ClassLoader loader) 
+0

是的,我使用ServiceLoader。我尝试过Thread.currentThread()。getContextClassLoader(),但它仍然返回了主应用程序的类加载器。 – MykelXIII

+0

那么我得到它使用上面提到的重载的方法工作。唯一的区别是我用load(Class service,Plugin.class.getClassLoader());. Thread.currentThread()。getContextClassLoader()仍然返回主应用程序的类加载器。 +1为重载的方法提示尽管:) – MykelXIII