我正在开发具有多个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>
答案 0 :(得分:0)
之前使用Spring远程处理时遇到过类似的问题。 Spring喜欢使用线程上下文类加载器动态加载类,这在OSGi中并不总是很好。
正常工作的负担不属于呼叫者,但它属于违规捆绑。我手边没有代码(几年前),但你需要简单地为Spring远程处理类提供类加载器(我假设你使用的是Spring远程处理)来正确处理类加载。
例如,如果bundle使用SimpleRemoteStatelesSessionProxyFactory,那么它应该调用setBeanClassLoader()方法。