OSGI服务与捆绑启动序列

  • 本文关键字:启动 服务 OSGI osgi
  • 更新时间 :
  • 英文 :


给定两个OSGI捆绑foobar,并且:

  • bar Imports(Import-Package:foo的软件包。
  • bar实现了foo中定义的服务。

允许 service foo使用(@Referencebar的服务(根据OSGI规范)?

首先解决捆绑包,然后按照符合其依赖性的顺序开始服务,从技术上讲应该是可能的。

(我不太感兴趣的某些特定的OSGI实施支持它。)

编辑背景:这样,OSGI捆绑包可以为某些库(SPI)(SPI)

提供自定义服务实现

@Reference是服务组件运行时规范的SCR注释。您必须区分分辨率阶段(安装捆绑包和使其制作 Active )和服务参考接线。

坚持SCR组件 - 您可以想象两个组件,两者都导出(@Service注释)一些服务并互相引用(使用@Reference) - 这样您就会陷入死锁状况。

但是您描述的场景似乎很好。

  1. barfoo导入软件包 - 因此在foo之后解决了。当然,如果您手动安装捆绑包,然后首先安装bar,然后安装foo,则必须刷新/重新启动bar
  2. foo @Reference bar的服务 - 仅表示SCR运行时将在服务可用后激活foo中给定的SCR组件

karaf使用其功能 为特征捆绑添加了另一层分辨率(标准OSGI解析器)。因此,它总是比手动安装捆绑包(或将它们全部丢弃到某些自动数据目录)更好。

还记得一件事。如果某种程度上,您的捆绑包获取Import-Service(或Require-Capability)清单标头(可能由Maven-Bundle-Plugin生成),则分辨率可能会失败,因为启动捆绑包(使用BluePrint或SCR Runtimes)后,通常以稍后的方式注册了服务,因此服务均可失败。我个人通常会使用此配置来摆脱这些标题:

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

相关内容

最新更新