java - 手动安装 bundle 时,OSGi 声明式服务不会绑定(bind)服务

标签 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 。请记住将文件中的行: 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 ”。

到目前为止我已经尝试过

  1. Based on the active issue我尝试确保安装的构建顺序,以便模块 A 在模块 B 之前安装,甚至反之亦然,只是为了确定。我什至尝试在第二个 bundle 达到“已启动”状态后安装该 bundle 。
  2. 模块A启动后调用模块B的update。
  3. 在安装 bundle 时查找是否需要执行有关注册和手动提供不同服务的任何操作,但我找不到任何内容,或者根本不理解答案。
  4. 我尝试过很多愚蠢的事情,在这里尝试或描述可能没有意义。

额外问题

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

这种构建应用程序的方式是否可行,还是我们应该寻求其他方式?如果是的话哪个?

最佳答案

您的 DS 引用使用可选基数,但未使用贪婪 policy option 。 (出于历史向后兼容性的原因,不情愿策略选项是默认选项。)

使用reluctant,当稍后注册附加/更好的服务时,例如在使用服务的 bundle 之后开始提供服务的 bundle ,引用将不会被反弹。使用贪婪,引用将被反弹。

关于java - 手动安装 bundle 时,OSGi 声明式服务不会绑定(bind)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55168855/

相关文章:

Java BufferedReader 回到文本文件的顶部?

java - 如何实现一个AlertDialog.Builder 选中项的点击事件?

osgi - 如何使用 Tycho 构建与 Felix 兼容的 OSGi 包?

java - Apache Karaf 蓝图服务 <reference> 未注入(inject)对象

maven - Felix 1.4.0 OSGi 中的 Axis2

java - 我应该保持 OSGi ServiceTracker 打开,还是在使用后关闭它?

java - 项目编码设置为 UTF-8,默认字符集返回 windows-1252

java - 尽管 karaf 实例被杀死,但 OSGi 组件工厂对象被创建了两次

java - 创建需要用户参数的 OSGI 服务

java - Java 从 ArrayList 中删除