【问题标题】:Interdependency among two OSGi bundles两个 OSGi 包之间的相互依赖关系
【发布时间】:2012-08-08 09:41:16
【问题描述】:

假设有两个 OSGi 包的 A 和 B 分别导出 x 和 y 包。 如果存在 A 依赖于 B 的导出而 B 依赖于 A 的导出的情况,应该首先启动哪一个。 假设一个人想从不同类(即不在 Activator 类中)的共享注册表中获取 ServiceReference,那么如何使用当前包的上下文初始化 BundleContext 对象。

这可能会解决我上面提到的关于相互依赖的情况。 就像 A 可以在其激活器的 start 方法中使用 B 的导出,而 B 可以在调用时在不同类的方法中使用 A 的导出

【问题讨论】:

  • 如果A依赖B,B依赖A,能不能启动这两个bundle?对于 bundlecontext,我认为我们有一个 BundleContextAware 接口
  • BundleContext bundleContext = FrameworkUtil.getBundle(JasperService.class).getBundleContext(); ServiceReference> empServiceReference = bundleContext.getServiceReference(yourclassname.class.getName());
  • 这适用于在除激活器之外的类中获取当前包的包上下文。

标签: osgi


【解决方案1】:

包解析(resolving)不同于启动和运行包。不要将两者混为一谈,这一点非常重要。

OSGi 框架可以解决包依赖关系中的循环问题。因此,一旦解决了捆绑包,就可以按某种顺序启动它们。您需要确保您不会将捆绑包设计为依赖于它们的相对起始顺序。这就是您使用服务和 DS 之类的东西的原因。无法解决服务依赖中的循环。所以一定要避免这样的循环。

【讨论】:

  • 可能有用的补充:服务依赖循环可以工作,只要循环中的至少一个链接是可选的和动态的。
  • 谢谢。我发现这种用例的唯一解决方案是如果它们相互依赖,则合并两个捆绑包。甚至创建第三个捆绑包似乎也不可行。
猜你喜欢
  • 2013-09-18
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多