2

我有一个项目正在尝试转换为 OSGi。然而,这个项目是用 Guice 作为它的依赖注入管理器构建的。这是一个与 Guice 交织在一起的大型项目。Guice 一直在给我很多适应转换过程的机会。具体来说,com.google.inject.internal.cglib.reflect.FastClass 给了我一个 NoClassDefFoundError。我确保没有任何东西是包私有的,我还下载并使用了 guice-2.0-customloader.jar。尽管如此,还是无济于事。

走这条路的人有什么建议吗?值得一提的是,我使用 peaberry 从 OSGi 环境(用于插件式架构)获取动态服务,然后在程序中使用这些服务。

非常感谢,史蒂夫

4

4 回答 4

4

很难确切地说出问题是什么,类加载器问题在 OSGi 中可能是非常特定的情况并且难以调试。

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

您将需要检查 OSGi 规范以创建 Fragment 包并使该片段包成为框架扩展片段。我只能使用 Eclipse 的 Equinox 运行时来做到这一点。在我编写大部分支持类的时候,Apache Felix 还不支持框架扩展片段。现在可能已经改变了。我对框架一无所知(knopplefish,spring-dm)

于 2009-11-01T16:03:16.447 回答
4

只需使用Peaberry 即可。它具有在 OSGi 中使用 Guice 所需的所有支持。无需从头开始重新发明一切!

于 2009-11-12T11:23:20.020 回答
1

我假设您对 package-private 的评论与Guice 和桥接类加载器上的此页面有关?

有一个错误报告/补丁可能与您的问题有关:http ://code.google.com/p/google-guice/issues/detail?id=343

您是否尝试过将 Guice 和 cglib 添加到标准类路径并为它们进行引导委托?这将证明/反驳您的问题与上述错误报告中提到的问题相同。

于 2009-11-01T15:51:18.903 回答
0

你可以试试我最新的第 343 期补丁——刚刚附上了一个新补丁的版本,它是最新的 Guice 主干加上这个补丁,所以人们可以尝试它并提供反馈。

最新的补丁避免了很多这些 CGLIB 异常,而不强制您将类公开,并且还在少数仍然需要这样做的剩余地方提供了更好的错误消息(基本上当您显式使用方法拦截时)。

于 2009-11-16T18:16:01.100 回答