我在JBoss 7.1.1中部署了一个简单的OSGi测试包,并尝试通过
动态实例化Jacorb ORBClass 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]
我已经做了什么:
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?
提前致谢
亚历
答案 0 :(得分:1)
经过几个小时的挖掘,我做了拼图; - )
standalone.xml/domain.xml
JBoss配置中,我在<capability name="org.jacorb" startlevel="1"/>
<subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">
部分添加了<capabilities>
META-INF/MANIFEST.MF
我添加DynamicImport-Package: org.jacorb.orb
以允许类加载器在运行时动态扩展类路径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。