2014-02-12 123 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