手动安装bundle时,OSGi声明性服务不绑定服务

问题描述 投票:0回答:1

我想要实现的目标

使用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。请记住将文件中的行:module C,dk.sdu.ace.dp.Controller,第27-28行更改为模块B和A的位置。

  • 模块A是“TCP服务器OSGi Bundle”
  • 模块B是“游戏世界OSGi捆绑”
  • 模块C是“Dependency Controller OSGi Bundle”
  • 模块D是“Server Engine OSGi Bundle”。

到目前为止我尝试过的

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

额外的问题

声明服务是否应该在通过bundlecontext安装和启动时自动将提供程序与引用绑定?

这种构建应用程序的方式是否可行,或者我们应该采用另一种方式吗?如果是这样的话?

java osgi apache-felix equinox declarative-services
1个回答
1
投票

您的DS引用使用可选基数而不使用greedy policy option。 (出于历史向后兼容性原因,reluctant策略选项是默认选项。)

使用reluctant时,如果稍后注册了额外/更好的服务,例如提供服务的软件包在服务于服务的软件包之后开始,则引用将不会被反弹。有了greedy,参考将会反弹。

© www.soinside.com 2019 - 2024. All rights reserved.