Java Netbeans中的OSGi,检索服务时的ClassCastException

Java Netbeans中的OSGi,检索服务时的ClassCastException,java,netbeans,osgi,classcastexception,apache-felix,Java,Netbeans,Osgi,Classcastexception,Apache Felix,我有一个类加载器问题。 因为我是一个osgi新手,希望答案不是那么难:) 我认为这与编译库和运行库有关。 在Netbeans 6.7.1项目属性中,compiletime库始终传播到其他类别。。所以我无法区分这一点 编译FelixHost时,将使用下一个JAR 菲利克斯·贾尔 osgi-core.jar osgi-compendium.jar osgi.service.obr-1.0.2.jar 但在运行时,框架将加载OBR的实现。 此OBR包还包含接口定义。我想这就是为什么会有classC

我有一个类加载器问题。 因为我是一个osgi新手,希望答案不是那么难:)

我认为这与编译库和运行库有关。 在Netbeans 6.7.1项目属性中,compiletime库始终传播到其他类别。。所以我无法区分这一点

编译FelixHost时,将使用下一个JAR

  • 菲利克斯·贾尔
  • osgi-core.jar
  • osgi-compendium.jar
  • osgi.service.obr-1.0.2.jar
但在运行时,框架将加载OBR的实现。 此OBR包还包含接口定义。我想这就是为什么会有classCastException

实际上,我希望FelixHost与OBR一起做一些初始设置 供应

欢迎提出任何想法。

我假设“FelixHost”指的是封装和启动Felix框架的项目

问题是,您必须对“OSGi世界”和“非OSGi世界”之间的边界有点谨慎。放在FelixHost类路径上的所有内容(也就是说,在您的例子中,所有编译时依赖项)基本上都是在OSGi世界之外的,因此不建议以这种方式使用像“OSGi.service.obr-1.0.2.jar”这样的捆绑包

正如您所指出的,如果OSGi框架也加载“OSGi.service.obr-1.0.2.jar”捆绑包,您将进入ClassCastException,因为您基本上有两个相同类(接口)的版本


这个问题的一个可能的解决方案是将您的初始配置逻辑分离到一个单独的包中,并在OSGi世界中执行与OBR相关的工作。然后,您可以删除FelixHost对“osgi.service.obr-1.0.2.jar”的编译依赖项,并且只加载一个obr接口副本

事实上,我已经在规范中读到了它,当我输入这个问题时,它变得越来越清晰。谢谢你提供的非常清晰的信息。我相信它对其他OSGi新手也很有用:)我发现Felix网站提供了关于这方面的具体信息: