我有一个项目,我试图转换为OSGi。但是,这个项目是用Guice作为依赖注入管理器构建的。这是一个大型项目,Guice交织在一起。 Guice给了我许多适合转换过程的东西。具体来说,它为com.google.inject.internal.cglib.reflect.FastClass提供了一个NoClassDefFoundError。我确保没有任何包是私有的,我也下载并使用了guice-2.0-customloader.jar。但是,无济于事。
有没有任何人建议走这条道路?值得一提的是,我使用peaberry从OSGi环境(对于插件类型的体系结构)获取动态服务,然后我将在程序中使用它。
非常感谢, 史蒂夫
答案 0 :(得分:4)
很难确切地说出问题所在,类加载器问题可能在OSGi中非常具体,难以调试。
如果guice确实是你的应用程序的核心,那么将它作为System Bundle的Fragment包可能是有意义的。 System Bundle是ALL bundle的类加载器树中的根节点。如果此捆绑包中存在类,则它们随处可访问。这是我成功用于将Swing LAF(Substance,Alloy,Jide)包装成OSGi包的技术。他们必须处于根级别,因为我的所有捆绑包都使用Swing(尤其是Swing类加载器)
您需要检查OSGi规范以创建Fragment包并使该片段包成为框架扩展片段。我只能使用Eclipse的Equinox运行时来做到这一点。当我编写大部分支持类时,Apache Felix还不支持框架扩展片段。它现在可能已经改变了。我不知道框架(knopplefish,spring-dm)
答案 1 :(得分:4)
只需使用Peaberry即可。它具有在OSGi中使用Guice所需的所有支持。无需从头开始重塑一切!
答案 2 :(得分:1)
我假设您对package-private的评论与Guice and bridging class loaders上的此页面相关?
可能与您的问题有关的错误报告/补丁:http://code.google.com/p/google-guice/issues/detail?id=343
您是否尝试将Guice和cglib添加到标准类路径并为它们执行引导委派?这将证明/反驳您的问题与上述错误报告中提到的相同。
答案 3 :(得分:0)
您可以尝试Issue 343的最新补丁 - 只需附加一个新修补的版本,这是最新的Guice主干加上这个补丁,所以人们可以尝试并提供反馈。
最新的补丁避免了很多这些CGLIB异常而不强迫你公开类,并且在剩下的几个地方提供了更好的错误信息,这仍然是必要的(基本上当你明确使用方法拦截时)。