Servicemix - OSGi类加载嵌入式依赖项的问题

时间:2011-09-27 08:44:05

标签: java osgi classloader apache-servicemix

我正在开发具有多个OSGi包的项目,部署在ServiceMix上(FuseESB编译,v.4.3.1)。问题是,其中一个bundle连接到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;
}

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

我的问题是:嵌入jar是非常特殊的,只有当调用来自嵌入包(或使用类加载器swich技巧)时,这个嵌入类才会可见,或者在嵌入包时还有更多要指定的内容我忘记了吗?

我正在使用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>

1 个答案:

答案 0 :(得分:0)

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

正常工作的负担不属于呼叫者,但它属于违规捆绑。我手边没有代码(几年前),但你需要简单地为Spring远程处理类提供类加载器(我假设你使用的是Spring远程处理)来正确处理类加载。

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