OSGi服务与捆绑启动顺序

问题描述 投票:3回答:1

鉴于两个OSGi捆绑包foobar,以及:

  • 来自barImport-Package:进口(foo)包装。
  • bar实现了foo中定义的服务。

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

通过首先解析bundle然后以满足其依赖性的顺序启动服务,技术上应该是可能的。

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

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

osgi
1个回答
2
投票

@Reference是服务组件运行时规范的SCR注释。您必须区分解决阶段(安装捆绑包并使其处于活动状态之间的过程)和服务参考连接。

坚持使用SCR组件 - 你可以设想两个组件,包括导出(@Service注释)一些服务和相互引用(使用@Reference) - 这样你就会陷入死锁状态。

但你描述的情景似乎很好。

  1. barfoo进口包裹 - 所以它在foo之后得到解决。当然,如果你手动安装捆绑包,你首先安装bar然后foo,你必须刷新/重启bar
  2. 来自foo@Reference bars服务 - 它只表示SCR运行时将在服务可用后激活foo中给定的SCR组件

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

还记得一件事。如果以某种方式,你的bundle获得Import-Service(或Require-Capability)清单头(这些可能由maven-bundle-plugin生成),解析可能会失败,因为服务通常在以后启动bundle(使用blueprint或scr运行时)后异步注册。我个人通常使用此配置摆脱这些标头:

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <extensions>true</extensions>
  <configuration>
    <instructions>
      <_removeheaders>Import-Service,Require-Capability</_removeheaders>
...
    </instructions>
...
© www.soinside.com 2019 - 2024. All rights reserved.