2009-10-30 69 views
2

我有一个项目,我试图转换为OSGi。然而,这个项目是由Guice作为它的依赖注入管理器构建的。这是一个与Guice交织在一起的大型项目。 Guice在转换过程中给了我很多帮助。具体来说,com.google.inject.internal.cglib.reflect.FastClass已经给了我一个NoClassDefFoundError。我确定没有任何软件包是私有的,我也下载并使用了guice-2.0-customloader.jar。尽管如此,无济于事。在OSGi中使用Guice

是否有任何人走过这条道路的建议?值得一提的是,我使用peaberry从OSGi环境中获得动态服务(对于插件类型的体系结构),然后在程序中使用。

非常感谢, 史蒂夫

+0

您正在使用哪种OSGi运行时? – basszero 2009-11-01 15:57:54

回答

4

很难说究竟是什么问题,classloader问题可能是OSGi特有的情况,很难调试。

如果guice真的是你的应用程序的核心,那么使它成为System Bundle的一个Fragment bundle是有意义的。 System Bundle是所有bundle的类加载器树中的根节点。如果这个包中存在类,它们将在任何地方都可访问。这是我成功用来将Swing LAF(Substance,Alloy,Jide)包装为OSGi捆绑包的技术。因为我的所有捆绑包都使用Swing(尤其是Swing类加载器),所以它们必须位于根级别

您需要检查OSGi规范以创建Fragment捆绑包并将该碎片捆绑为框架扩展碎片。我只能使用Eclipse的Equinox运行时执行此操作。在我编写大部分支持类的时候,Apache Felix还不支持框架扩展片段。它现在可能已经改变了。我不知道框架(knopplefish,spring-dm)

4

只需使用Peaberry。它拥有在OSGi中使用Guice所需的全部支持。没有必要从头开始重塑一切!

0

你可以尝试我的最新补丁Issue 343 - 只是附上一个新修补的版本,这是最新的Guice主干加上这个补丁,所以人们可以尝试并提供反馈。

最新的补丁可以避免很多这些CGLIB异常,而不会强迫您公开类,并且在仍然需要的几个剩余位置(基本上是您明确使用方法拦截时)中提供了更好的错误消息。