无法找到服务,因为未激活OSGi包

Pau*_*rer 5 spring osgi bundle equinox springsource-dm-server

我在发现一些未被激活的OSGi包提供的服务时遇到问题.让我来描述一下情况:

  • Bundle A定义了接口X.
  • 捆绑包B,C和D提供实现接口X的服务
    • 这些bundle的服务是通过Spring DM注册的,所以只有在激活bundle并且Spring DM初始化bundle中定义的应用程序上下文时才会创建它们.
  • Bundle A被激活,并且在某些时候向服务注册表询问接口X的服务.它没有找到任何,因为bundle B,C和D尚未被移动到ACTIVE状态(它们仅被解析).

我似乎无法启动捆绑包B,C或D,因此注册他们的服务.强制它们通过添加它们来启动config.ini不是一个选项,因为可以在应用程序中安装任意数量的bundle(通过类似Eclipse p2的更新机制)来实现接口X.

该应用程序是一个基于Eclipse 3.5的RCP应用程序,使用Spring 2.5.6和Spring DM 1.2.1.

如何强制激活这些捆绑包?

Mar*_*iot 6

你真正拥有的是依赖层次结构问题,你提出的hacky解决方案实际上只是对基础问题的创可贴.

您应该考虑的是系统的体系结构,因为您拥有的是循环依赖(re:在您的原始帖子的评论中进行讨论).你有(喜欢或不喜欢)A需要来自(在某种意义上取决于)B和C的服务.同时,B和C直接依赖于A,因此,直到A出现才能开始.

在最好的情况下,你可以用B和C编写代码来监听A的存在,但这最好掩盖了(正如我所提到的)潜在的问题.你应该考虑的是将A分成两个束,我们称之为A1和A2.

A1应提供B和C所需的接口(取决于).A2应该有服务B和C所依赖的监听器.在启动时,如果B和C是必需的服务,则必须运行A1,但A2可以在以后的任何时间启动,并且一切都应该有效.