【问题标题】:Using Guice with OSGi在 OSGi 中使用 Guice
【发布时间】:2009-10-30 13:35:18
【问题描述】:

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

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

非常感谢, 史蒂夫

【问题讨论】:

  • 您使用的是哪个 OSGi 运行时?

标签: java osgi guice


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我假设您在 package-private 上的 cmets 与 Guice and bridging class loaders 上的此页面相关?

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

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

      【讨论】:

        【解决方案4】:

        您可以尝试我为Issue 343 提供的最新补丁 - 刚刚附加了一个新补丁的构建,它是最新的 Guice 主干加上这个补丁,因此人们可以尝试它并提供反馈。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-24
          • 2015-04-12
          • 2011-11-01
          • 2011-12-15
          • 2011-06-23
          • 2011-01-23
          • 2014-02-15
          • 2017-12-31
          相关资源
          最近更新 更多