1

我部署一个简单的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.jacorbMANIFEST.MF(也试过与不export选项):Dependencies: org.jacorb export

  • 我加入了jboss-deployment-structure.xmlMETA-INF包含以下内容

    < XML version =“1.0”encoding =“UTF-8”? > < JBoss的部署结构> <部署> <依赖性> <模块名称= “org.jacorb”/ > < /依赖性> < /部署> </JBoss的部署结构>

另外我做了实验与类加载器并认识到,ContextClassLoader是null。但最终,我无法将其作为非测试代码来实现,因为Class.forName()无法更改为使用特定的类加载器。

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

在此先感谢

亚历

回答

0

如果你有一个正常的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。

1

后挖我确实拼图;-)

  1. standalone.xml/domain.xml的JBoss配置小时我在<subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">部分加入<capability name="org.jacorb" startlevel="1"/><capabilities>
  2. 下在我加入DynamicImport-Package: org.jacorb.orbMETA-INF/MANIFEST.MF以允许类加载器动态扩展运行期间的类路径
  3. 将上下文类加载器设置为Thread.currentThread().setContextClassLoader(getClass().getClassLoader(),该上下文类加载器在
  4. 之前已经是 null
+0

你试过'Import-Package:org.jacorb.org'或'Import-Package:org.jacorb.org; resolution = optional'?这些是推荐的方式,DynamicImport-Package不是。另外,Class.forName()*不会为类加载器提供可选参数。 – eis 2013-03-05 14:10:26