OSGi 服务与捆绑包启动顺序

OSGi service vs bundle startup sequence

给定两个 OSGi 包 foobar,并且:

是否允许foo中的服务使用(@Reference)来自[=的服务11=](根据 OSGi 规范)?

首先解析捆绑包,然后按照满足其依赖关系的顺序启动服务,这在技术上应该是可行的。

(我对某些特定的 OSGi 实现是否支持它不太感兴趣。)

编辑 背景:这样,OSGi 包可以为某些库提供自定义服务实现 (SPI)

@Reference 是服务组件运行时规范的 SCR 注释。 您必须区分 resolution 阶段(安装捆绑包和使其成为 active 之间的过程)和服务引用接线。

坚持使用 SCR 组件 - 你可以想象两个组件,它们都导出(@Service 注释)一些服务并相互引用(使用 @Reference) - 这样你就会陷入僵局。

但你描述的场景似乎没问题。

  1. barfoo 导入包 - 所以它在 foo 之后解决了。当然,如果你手动安装 bundle,你先安装 bar 然后 foo,你必须 refresh/restart bar
  2. foo @References 来自 bar 的服务 - 这仅意味着 SCR 运行时将在服务可用后激活 foo 中给定的 SCR 组件

Karaf 使用其 功能 为功能包添加了另一层解析(标准 OSGi 解析器)。所以它总是比手动安装包(或将它们全部放到某个 auto-deploy 目录)更好。

还记得一件事。如果不知何故,你的 bundle 得到 Import-Service(或 Require-Capability)清单 header(这些可能由 maven-bundle-plugin 生成),解析可能会失败,因为服务通常稍后异步注册,启动捆绑包后(使用蓝图或 scr 运行时)。我个人通常使用此配置摆脱这些 headers:

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <extensions>true</extensions>
  <configuration>
    <instructions>
      <_removeheaders>Import-Service,Require-Capability</_removeheaders>
...
    </instructions>
...