OSGi declarative-services 在手动安装包时不绑定服务
OSGi declarative-services does not bind services when manually installing bundles
我想要达到的目标
使用 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 server OSGi Bundle"
- 模块 B 是 "Game world OSGi Bundle"
- 模块 C 是 "Dependency Controller OSGi Bundle"
- 模块 D 是 "Server Engine OSGi Bundle"。
到目前为止我尝试了什么
- Based on the active issue 我尝试确保安装的构建顺序,以便模块 A 在模块 B 之前安装,甚至反之亦然。在第二个包达到 "started" 状态后,我什至尝试安装包。
- 模块A启动后调用模块B更新
- 如果我需要在安装捆绑包时手动注册和提供不同的服务,我找不到任何东西,或者根本不明白答案..
- 我已经尝试了很多愚蠢的事情,在这里尝试或描述可能没有意义。
补充问题
声明式服务是否应在通过 bundlecontext 安装和启动时自动将提供程序与引用绑定?
这种构建应用程序的方式是否可行,或者我们应该采用其他方式吗?如果是哪个?
您的 DS 引用使用了可选基数,但未使用 greedy
policy option。 (reluctant
策略选项是默认的历史向后兼容性原因。)
使用reluctant
,当稍后注册additional/better 服务时,例如提供服务的bundle 在使用服务的bundle 之后开始,引用将不会被反弹。使用greedy
,参考将被反弹。
我想要达到的目标
使用 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 server OSGi Bundle"
- 模块 B 是 "Game world OSGi Bundle"
- 模块 C 是 "Dependency Controller OSGi Bundle"
- 模块 D 是 "Server Engine OSGi Bundle"。
到目前为止我尝试了什么
- Based on the active issue 我尝试确保安装的构建顺序,以便模块 A 在模块 B 之前安装,甚至反之亦然。在第二个包达到 "started" 状态后,我什至尝试安装包。
- 模块A启动后调用模块B更新
- 如果我需要在安装捆绑包时手动注册和提供不同的服务,我找不到任何东西,或者根本不明白答案..
- 我已经尝试了很多愚蠢的事情,在这里尝试或描述可能没有意义。
补充问题
声明式服务是否应在通过 bundlecontext 安装和启动时自动将提供程序与引用绑定?
这种构建应用程序的方式是否可行,或者我们应该采用其他方式吗?如果是哪个?
您的 DS 引用使用了可选基数,但未使用 greedy
policy option。 (reluctant
策略选项是默认的历史向后兼容性原因。)
使用reluctant
,当稍后注册additional/better 服务时,例如提供服务的bundle 在使用服务的bundle 之后开始,引用将不会被反弹。使用greedy
,参考将被反弹。