java - 动态加载osgi包中的类

标签 java osgi osgi-bundle

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

这是我制作的支持 OSGI 的库 B 的 list 文件 -

Manifest-Version: 1.0
Bnd-LastModified: 1420745798993
Build-Jdk: 1.6.0_51
Built-By: xyz
Bundle-ManifestVersion: 2
Bundle-Name: dapclient
Bundle-SymbolicName: dapclient
Bundle-Vendor: dapclient
Bundle-Version: 1.0.0.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
DynamicImport-Package: com.xxx.zzz.wi.shared.datacache.model
Export-Package: com.xxx.platform.yyy.persistence.parser.entity;versio n="2.0.2.8",com.intuit.xxx.yyy.persistence.utils;version="2.0.2.8" ,com.xxx.platform.yyy.persistence.parser.domain;version="2.0.2.8",co m.xxx.platform.yyy.persistence;version="2.0.2.8",com.xxx.platform .yyy.persistence.types;version="2.0.2.8",com.xxx.platform.yyy.persis tence.annotations;version="2.0.2.8",com.xxx.platform.yyy.persistence .parser;version="2.0.2.8"
Tool: Bnd-2.1.0.20130426-122213

在此库中,我们使用 ClasspathHelper.forPackage(packageName) 加载此包,其中 packageName 为“com.xxx.zzz.wi.shared.datacache.model”。 ClasspatheHelper是从反射库中使用的。

最佳答案

classForName 使用“当前类的定义类加载器”,因此您可能必须导入 A 和 B 中的包才能使其工作。所以一般来说,ClassA 必须在一个单独的包中。 但如果您与库紧密耦合,最好将“B”嵌入到 Bundle A 中。

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

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);
}

关于java - 动态加载osgi包中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27845273/

相关文章:

java - 有没有办法在 Java 中只读取 JSON 文件的一部分?

java - 为什么这不从我的 java 列表中删除重复项?

java - 如何在我自己的API中实现Dicom属性字典

grails - Gail Maven-OSGI捆绑软件为依存关系-解决问题

java - 我们如何控制OSGI上资源的网页缓存?

java - 如何启动immediate = false组件?

java - 在 Eclipse 中使用多个 OSGi 包

java - 从字符串中删除制表符

jsf - 带有 OSGi 的 Java EE 6 应用程序

java - 如何实现OSGI动态元类型?