鉴于两个OSGi捆绑包foo
和bar
,以及:
bar
的Import-Package:
进口(foo
)包装。bar
实现了foo
中定义的服务。是否允许foo
中的服务使用(@Reference
)来自bar
的服务(根据OSGi规范)?
通过首先解析bundle然后以满足其依赖性的顺序启动服务,技术上应该是可能的。
(我对一些特定的OSGi实现是否支持它不太感兴趣。)
编辑背景:这样,OSGi包可以为某些库提供自定义服务实现(SPI)
@Reference
是服务组件运行时规范的SCR注释。您必须区分解决阶段(安装捆绑包并使其处于活动状态之间的过程)和服务参考连接。
坚持使用SCR组件 - 你可以设想两个组件,包括导出(@Service
注释)一些服务和相互引用(使用@Reference
) - 这样你就会陷入死锁状态。
但你描述的情景似乎很好。
bar
从foo
进口包裹 - 所以它在foo之后得到解决。当然,如果你手动安装捆绑包,你首先安装bar
然后foo
,你必须刷新/重启bar
foo
的@Reference
bar
s服务 - 它只表示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>
...