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

Java Servicemix-嵌入依赖项的OSGi类加载问题,java,osgi,classloader,apache-servicemix,Java,Osgi,Classloader,Apache Servicemix,我正在使用多个OSGi捆绑包开发项目,这些捆绑包部署在ServiceMix(FuseESB编译,第4.3.1版)上。问题是,其中一个捆绑包连接到WebLogic上的EJB,因此它嵌入了WebLogic.jar 解决方案是可行的,但需要一个技巧。捆绑包通过OSGi导出Spring服务。此服务导入到另一个捆绑包中,该捆绑包是系统的入口点。从这个包调用服务时,weblogic类是不可见的。工作技巧是将Spring服务包装在以下方面,临时切换类加载器: public Object profile

我正在使用多个OSGi捆绑包开发项目,这些捆绑包部署在ServiceMix(FuseESB编译,第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;
}
据我所知,该服务是使用条目包中的classloader调用的,而不是使用嵌入weblogic的包中的classloader调用的,对于这个classloader,嵌入的依赖类是不可见的。在类似的情况下,导出的Spring服务可以使用其捆绑包中的私有导入和私有包,但对于嵌入式JAR,情况并非如此

我的问题是:嵌入JAR是如此具体,以至于只有当调用来自嵌入包(或使用classloader swich技巧)时,这个嵌入类才会可见,还是在嵌入包时需要指定更多的内容,这是我忘记做的事情

我正在使用maven bundle插件


org.apache.felix
maven捆绑插件
${pom.artifactId}
${pom.groupId}.${pom.artifactId}
网络逻辑;范围=*,

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

但是,正确工作的负担不属于调用者,而是属于有问题的捆绑包。我手头没有代码(那是几年前的事了),但是您只需要向SpringRemoting类提供类加载器(我假设您正在使用SpringRemoting)就可以正确处理类加载


例如,如果捆绑包使用SimpleRemoteStatesessionProxyFactory,它应该调用该方法。

为什么要尝试“借用”另一个捆绑包的类加载器以查看所需的库?为什么不直接导入包呢?如果你不得不摆弄类加载器,这是一个很好的迹象,说明你的OSGi做得不对。正如我所写的,问题是从其他包调用的服务看不到来自嵌入式jar的包,这些包只由包本身使用,因此不会导出。你只是自相矛盾。如果包实际上只被一个包使用,那么你就不会有问题了。我使用的是普通的spring上下文,将spring上下文放在META-INF/spring包中。您所写的就是我所观察到的——spring服务使用的是调用bundle的类加载器,而不是调用bundle的类加载器:(您的意思是它使用spring dm来加载spring上下文?
        <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>