我想要实现的目标
使用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, line 27-28 更改为 module B 和 A 的位置。
- 模块 A 是“TCP 服务器 OSGi bundle ”
- 模块 B 是“游戏世界 OSGi Bundle”
- 模块 C 是“依赖 Controller OSGi bundle ”
- 模块 D 是“服务器引擎 OSGi bundle ”。
到目前为止我已经尝试过
- Based on the active issue我尝试确保安装的构建顺序,以便模块 A 在模块 B 之前安装,甚至反之亦然,只是为了确定。我什至尝试在第二个 bundle 达到“已启动”状态后安装该 bundle 。
- 模块A启动后调用模块B的update。
- 在安装 bundle 时查找是否需要执行有关注册和手动提供不同服务的任何操作,但我找不到任何内容,或者根本不理解答案。
- 我尝试过很多愚蠢的事情,在这里尝试或描述可能没有意义。
额外问题
在通过bundlecontext安装和启动时,声明性服务是否应该自动将提供者与引用绑定(bind)?
这种构建应用程序的方式是否可行,还是我们应该寻求其他方式?如果是的话哪个?
最佳答案
您的 DS 引用使用可选基数,但未使用贪婪
policy option 。 (出于历史向后兼容性的原因,不情愿
策略选项是默认选项。)
使用reluctant
,当稍后注册附加/更好的服务时,例如在使用服务的 bundle 之后开始提供服务的 bundle ,引用将不会被反弹。使用贪婪
,引用将被反弹。
关于java - 手动安装 bundle 时,OSGi 声明式服务不会绑定(bind)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55168855/