从OSGi-bundle中加载JBoss 7.1.1中的动态类时的ClassNotFoundException

时间:2012-07-19 07:54:17

标签: jboss classpath osgi classnotfoundexception dynamic-class-loaders

我在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 org.jacorb MANIFEST.MF上宣布了export - 描述符(也使用Dependencies: org.jacorb export选项进行了尝试):jboss-deployment-structure.xml < / p>

  • 我使用以下内容将META-INF添加到null

    &lt;?xml version =“1.0”encoding =“UTF-8”?&gt;    &LT; JBoss的部署-结构&gt;      &LT;部署&GT;        &LT;依赖性&GT;          &lt; module name =“org.jacorb”/&gt;        &LT; /依赖性&GT;      &LT; /部署&GT;    &LT; / JBoss的部署-结构&gt;

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

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

提前致谢

亚历

2 个答案:

答案 0 :(得分:1)

经过几个小时的挖掘,我做了拼图; - )

  1. standalone.xml/domain.xml JBoss配置中,我在<capability name="org.jacorb" startlevel="1"/>
  2. 下的<subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">部分添加了<capabilities>
  3. META-INF/MANIFEST.MF我添加DynamicImport-Package: org.jacorb.orb以允许类加载器在运行时动态扩展类路径
  4. 按照<{li}之前Thread.currentThread().setContextClassLoader(getClass().getClassLoader()的{​​{1}}设置上下文类加载器

答案 1 :(得分:0)

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

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