手动安装捆绑软件时,OSGi声明式服务不会绑定服务

时间:2019-03-14 17:38:39

标签: java osgi apache-felix equinox declarative-services

我要实现的目标

使用netbeans模块化系统为我们准备应用程序,因为我们通过apache felix使用声明式服务在OSGi中实现模块。这是模块设置:

  • 模块A-提供服务A和B
  • 模块B-提供服务C,参考服务A和B
  • 模块C-提供服务D,处理模块A和B的安装
  • 模块D-参考服务D和B。

模块C通过以下代码安装模块:

BundleContext context = FrameworkUtil.getBundle(class).getBundleContext();
Bundle tcp = context.installBundle("file:Location");
tcp.start();

所有内容均已安装并开始运行,没有错误。 但是声明的引用未绑定到服务。

要详细了解所有内容如何结合在一起,我将代码添加到了github https://github.com/jonaslagoni/server中。记住要更改文件中的行:模块C,dk.sdu.ace.dp.Controller,行27-28到模块B和A的位置。

  • 模块A是“ TCP服务器OSGi捆绑软件”
  • 模块B是“游戏世界OSGi捆绑包”
  • 模块C是“依赖项控制器OSGi捆绑包”
  • 模块D是“服务器引擎OSGi捆绑包”。

到目前为止我尝试过的事情

  1. Based on the active issue我试图确保安装的构建顺序,以便确保在模块B之前安装模块A,甚至可以反过来确保安装。在第二个捆绑包达到“开始”状态之后,我什至尝试安装捆绑包。
  2. 启动模块A后,在模块B上调用更新。
  3. 查找我是否需要做一些有关注册的事情,并在安装捆绑包时手动提供其他服务,找不到任何东西,或者根本不理解答案。
  4. 我尝试了很多愚蠢的事情,在这里尝试或描述它们可能没有任何意义。

其他问题

声明性服务在通过bundlecontext安装并启动时是否应自动将提供者与引用绑定?

这种构建应用程序的方式是否可行,还是应该采用另一种方式?如果是这样?

1 个答案:

答案 0 :(得分:1)

您的DS参考正在使用可选基数,而不使用greedy policy option。 (出于历史记录向后兼容的原因,{reluctant策略选项是默认选项。)

使用reluctant,当以后注册其他/更好的服务(例如提供服务的捆绑包在消费捆绑包之后开始提供服务)时,引用将不会反弹。使用greedy,引用将被反弹。