2

我在 JBoss 7.1.1 中部署了一个简单的 OSGi 测试包,并尝试通过执行动态实例化 Jacorb ORB

Class clazz = Class.forName("org.jacorb.orb.ORB");

我得到的只是

java.lang.ClassNotFoundException: org.jacorb.orb.ORB from [Module "deployment.test:1.0.0" from Service Module Loader]

我已经做了什么:

  • 在 JBoss 配置中,standalone.xml我为 osgi-subsystem 添加了能力<capability name="org.jacorb" startlevel="1"/>,以便org.jacorb加载模块。这已经解决了我的测试包安装失败的问题。
  • 我在我的Dependencies-Descriptor中声明了(也尝试过使用和不使用该选项):org.jacorbMANIFEST.MFexportDependencies: org.jacorb export

  • 我将以下内容添加jboss-deployment-structure.xml到我的META-INF

    <?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="org.jacorb" /> </dependencies> </deployment> < /jboss-部署结构>

我还对 ClassLoaders 进行了实验,并意识到 ContextClassLoader 是null. 但最后,我不能将其作为非测试代码来实现,因为Class.forName()无法更改为使用特定的类加载器。

那么为什么我会得到这个 ClassNotFoundException 呢?

提前致谢

亚历克斯

4

2 回答 2

1

经过几个小时的挖掘,我完成了这个难题;-)

  1. standalone.xml/domain.xmlJBoss 配置中,我<capability name="org.jacorb" startlevel="1"/>在下面的<subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">部分中添加了<capabilities>
  2. META-INF/MANIFEST.MF我添加DynamicImport-Package: org.jacorb.orb以允许类加载器在运行时动态扩展类路径
  3. Thread.currentThread().setContextClassLoader(getClass().getClassLoader()通过null之前设置的上下文类加载器
于 2012-07-20T05:11:42.513 回答
0

如果你有一个普通的 OSGi 包并且它应该看到 org.jacorb.orb.ORB 类,那么你应该有: 1. 必须在 osgi 框架中导出所有 org.jacorb 包和子包。2. 你的包必须导入所有你使用的包——例如“Import-Package:org.jacorb.orb” 检查版本是否兼容。检查您是否导入了所有包和子包。org.jacorb 的导入并不意味着 org.jacorb.orb。

如果两个条件都满足,那么你的 bundle 的 Bundle Classloader 应该能够看到 org.jacorb.orb.ORB。

于 2012-07-19T10:10:56.657 回答