的ClassNotFoundException而JBoss的7.1.1动态类加载从OSGi的捆绑
我部署一个简单的OSGi的测试包成的JBoss 7.1.1,并尝试做的ClassNotFoundException而JBoss的7.1.1动态类加载从OSGi的捆绑
Class clazz = Class.forName("org.jacorb.orb.ORB");
我的一切动态实例化Jacorb ORB是
java.lang.ClassNotFoundException: org.jacorb.orb.ORB from [Module "deployment.test:1.0.0" from Service Module Loader]
我已经做了:
- 在JBoss配置
standalone.xml
我添加的F或osgi子系统的能力<capability name="org.jacorb" startlevel="1"/>
,以便加载org.jacorb
模块。这已经解决了这个问题,我的测试包安装失败。 我宣布
Dependencies
-Descriptor上org.jacorb
我MANIFEST.MF
(也试过与不export
选项):Dependencies: org.jacorb export
-
我加入了
jboss-deployment-structure.xml
我META-INF
包含以下内容< XML version =“1.0”encoding =“UTF-8”? > < JBoss的部署结构> <部署> <依赖性> <模块名称= “org.jacorb”/ > < /依赖性> < /部署> </JBoss的部署结构>
另外我做了实验与类加载器并认识到,ContextClassLoader是null
。但最终,我无法将其作为非测试代码来实现,因为Class.forName()
无法更改为使用特定的类加载器。
那么,为什么我会得到这个ClassNotFoundException?
在此先感谢
亚历
如果你有一个正常的OSGi包,并且应该看到org.jacorb.orb.ORB类, 那么你应该有: 1.所有org.jacorb包和子包必须在osgi框架中导出。 2.您的软件包必须导入您使用的所有软件包 - 例如与 “Import-Package:org.jacorb.orb” 检查版本是否兼容。 检查您是否导入所有包和子包。 org.jacorb的导入并不意味着org.jacorb.orb。
如果两个条件都满足,那么bundle的Bundle Classloader应该能够看到org.jacorb.orb.ORB。
后挖我确实拼图;-)
- 在
standalone.xml/domain.xml
的JBoss配置小时我在<subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">
部分加入<capability name="org.jacorb" startlevel="1"/>
<capabilities>
- 下在我加入
DynamicImport-Package: org.jacorb.orb
的META-INF/MANIFEST.MF
以允许类加载器动态扩展运行期间的类路径 - 将上下文类加载器设置为
Thread.currentThread().setContextClassLoader(getClass().getClassLoader()
,该上下文类加载器在 之前已经是
null
你试过'Import-Package:org.jacorb.org'或'Import-Package:org.jacorb.org; resolution = optional'?这些是推荐的方式,DynamicImport-Package不是。另外,Class.forName()*不会为类加载器提供可选参数。 – eis 2013-03-05 14:10:26