【问题标题】:Java services loaded with service loader loading their own services with service loader使用服务加载器加载的 Java 服务使用服务加载器加载自己的服务
【发布时间】:2014-03-10 13:51:30
【问题描述】:

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

【问题讨论】:

    标签: java service-provider


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我确实使用了 ServiceLoader。我尝试了 Thread.currentThread().getContextClassLoader() 但它仍然返回了主应用程序的类加载器。
    • 好吧,我用上面提到的重载方法让它工作了。唯一的区别是我使用了 load(Class service, Plugin.class.getClassLoader() );。 Thread.currentThread().getContextClassLoader() 仍然返回主应用程序的类加载器。为重载方法提示 +1 :)
    【解决方案2】:

    好吧,我使用上面提到的重载方法让它工作。唯一的区别是我使用了 load(Class service, Plugin.class.getClassLoader() );。 Thread.currentThread().getContextClassLoader() 依然返回主应用的类加载器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多