【发布时间】: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