【发布时间】:2011-01-01 19:58:04
【问题描述】:
我在发现某些未激活的 OSGi 捆绑包提供的服务时遇到问题。让我描述一下情况:
- Bundle A 定义了接口 X
- 捆绑 B、C 和 D 提供实现接口 X 的服务
- 这些捆绑包的服务是通过 Spring DM 注册的,因此它们仅在捆绑包被激活并且 Spring DM 初始化捆绑包中定义的应用程序上下文时创建
- Bundle A 被激活,并且在某个时候向服务注册表询问接口 X 的服务。它没有找到任何服务,因为 bundle B、C 和 D 尚未进入 ACTIVE 状态(它们只是 RESOLVED )。
我似乎无法启动捆绑包 B、C 或 D,因此无法注册它们的服务。通过将它们添加到 config.ini 来强制它们开始不是一个选项,因为可以在应用程序中安装任意数量的包(通过类似 Eclipse p2 的更新机制)实现接口 X。
该应用程序是基于 Eclipse 3.5 的 RCP 应用程序,使用 Spring 2.5.6 和 Spring DM 1.2.1。
如何强制激活这些捆绑包?
【问题讨论】:
-
您能否提供一些有关您收到的错误消息的信息?并且:Bundle A 导出接口 X,Bundle B、C、D 导入,对吧?
-
是的,接口X由bundle A导出,由B、C、D导入,没有任何错误信息。在服务注册表中对实现 X 的服务的查询只返回一个空列表。
-
您在
A中请求的基数是多少?如果是1..N,你就有一个循环依赖。 -
A中的基数是0..N。您能否详细说明1..N如何导致循环依赖?我不太明白。 -
如果是
1..N,您将需要一个来自捆绑包B和C的实例,然后才能启动A,但B和@ 987654332@ 对A有严格的依赖关系,因此没有一个包能够出现。如果您手动刷新A,然后是B,然后是C,会发生什么?
标签: spring osgi bundle equinox springsource-dm-server