【问题标题】:Servicemix - OSGi classloading issues with embedded dependenciesServicemix - 具有嵌入式依赖项的 OSGi 类加载问题
【发布时间】:2011-11-25 20:27:09
【问题描述】:

我正在开发具有多个 OSGi 捆绑包的项目,部署在 ServiceMix 上(FuseESB 编译,v. 4.3.1)。问题是,其中一个捆绑包连接到 WebLogic 上的 EJB,因此它嵌入了 weblogic.jar。

解决方案有效,但需要一个技巧。捆绑包通过 OSGi 导出 Spring 服务。该服务被导入到另一个捆绑包中,该捆绑包是系统的入口点。当从这个包调用服务时,weblogic 类是不可见的。工作技巧是在以下方面包装 Spring 服务,临时切换类加载器:

    public Object profileInventory(ProceedingJoinPoint pjp) throws Throwable {
    Object output = null;
    ClassLoader clOld = Thread.currentThread().getContextClassLoader();

    try {
        Thread.currentThread().setContextClassLoader(pjp.getTarget().getClass().getClassLoader());
        output = pjp.proceed();
    } finally {
        Thread.currentThread().setContextClassLoader(clOld);
    }
    return output;
}

据我所知,该服务是使用条目包中的类加载器调用的,而不是使用嵌入 weblogic 的包中的类加载器调用的,并且对于这个类加载器,嵌入的依赖类是不可见的。在类似的情况下,导出的 Spring 服务可以使用其捆绑包中的私有导入和私有包,但对于嵌入式 jar,则不是这样。

我的问题是:嵌入 jar 是否如此具体,以至于只有当调用源自嵌入包(或使用类加载器开关技巧)时,才能看到嵌入的类,或者在嵌入包时需要指定更多内容,我忘了做吗?

我正在使用 maven-bundle-plugin

        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <configuration>
                <instructions>
                    <Bundle-Name>${pom.artifactId}</Bundle-Name>
                    <Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName>
                    <Embed-Dependency>
                 weblogic;scope=*,
                    </Embed-Dependency>

【问题讨论】:

  • 你为什么要“借用”另一个包的类加载器来查看你需要的库?为什么不直接导入包?如果你不得不使用类加载器,这是一个好兆头,你做错了 OSGi。
  • 正如我所写,问题是从其他包调用的服务看不到嵌入式 jar 中的包,这些包仅由包本身使用,因此不会导出。
  • 你只是自相矛盾。如果这些包真的只被一个捆绑包使用,那么你不会有问题。

标签: java osgi classloader apache-servicemix


【解决方案1】:

我之前在使用 Spring 远程处理时也遇到过类似的问题。 Spring 喜欢使用线程上下文类加载器动态加载类,这在 OSGi 中并不总是很好。

但是,正确工作的负担不属于调用者,它属于有问题的捆绑包。我手头没有代码(那是几年前的事了),但您只需将类加载器提供给 Spring 远程处理类(我假设您正在使用 Spring 远程处理)来正确处理类加载。

例如,如果包使用 SimpleRemoteStatelesSessionProxyFactory,它应该调用setBeanClassLoader() 方法。

【讨论】:

  • 我使用普通的弹簧上下文,将弹簧上下文放在 META-INF/spring 包中。您所写的就是我所观察到的-spring服务正在使用来自调用包的类加载器,而不是来自被调用的包:(
  • 你的意思是它正在使用 Spring dm 来加载 spring 上下文?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2018-10-05
  • 2014-09-14
  • 2015-05-03
  • 2019-08-27
  • 2014-11-20
  • 1970-01-01
相关资源
最近更新 更多