在osgi包中动态加载类

时间:2015-01-08 16:46:19

标签: java osgi osgi-bundle

我的OSGI捆绑(比如A)依赖于非osgi库(说B)。 B使用Class.forName加载其中一个类(库A中的ClassA是来自库B的ClassB类型)。我已经包装了库B并将其作为osgi包并导入了库A中所需的包,但是我无法使用Class.forName加载该类。请注意,图书馆B是第三方图书馆,我对此没有任何控制权。

这是库B的清单文件,我使用OSGI启用了库 -

  

清单 - 版本:1.0
Bnd-LastModified:1420745798993
  Build-Jdk:1.6.0_51
内置:xyz
Bundle-ManifestVersion:   2
捆绑名称:dapclient
Bundle-SymbolicName:dapclient
  捆绑供应商:dapclient
捆绑版本:1.0.0.SNAPSHOT
  创建者:Apache Maven Bundle插件
DynamicImport-Package:   com.xxx.zzz.wi.shared.datacache.model
出口包装:   com.xxx.platform.yyy.persistence.parser.entity; versio   N =" 2.0.2.8",com.intuit.xxx.yyy.persistence.utils;版本=" 2.0.2.8"   ,com.xxx.platform.yyy.persistence.parser.domain;版本=" 2.0.2.8",共   m.xxx.platform.yyy.persistence;版本=" 2.0.2.8",com.xxx.platform   .yyy.persistence.types;版本=" 2.0.2.8",com.xxx.platform.yyy.persis   tence.annotations;版本=" 2.0.2.8",com.xxx.platform.yyy.persistence   .parser; version =" 2.0.2.8"
工具:Bnd-2.1.0.20130426-122213

在这个库中,我们使用ClasspathHelper.forPackage(packageName)重新加载这个包,其中packageName是" com.xxx.zzz.wi.shared.datacache.model"。 ClasspatheHelper用于反射库。

1 个答案:

答案 0 :(得分:0)

classForName使用“当前类的定义类加载器”,因此您可能必须将包导入A和B才能完成此工作。因此,通常,ClassA必须在单独的捆绑软件中。 但是,如果您与lib紧密相连,最好将'B'int Bundle A嵌入其中。

除此之外,您还可以向B的创建者打开一张票证,以允许进行更通用的类加载,例如提供类本身而不是字符串,支持某种类型的解析器挂钩或至少使用其中的上下文类加载如果你可以使用类似的东西

Thread thread = Thread.currentThread();
ClassLoader oldLoader = thread.getContextClassLoader();
try {
    thread.setContextClassLoader(getClass().getClassLoader());
    //call lib here that supports context-class-loading
} finally {
    thread.setContextClassLoader(oldLoader);
}