给定两个OSGI捆绑foo
和bar
,并且:
-
bar
Imports(Import-Package:
)foo
的软件包。 -
bar
实现了foo
中定义的服务。
允许
service 在foo
使用(@Reference
)bar
的服务(根据OSGI规范)?
首先解决捆绑包,然后按照符合其依赖性的顺序开始服务,从技术上讲应该是可能的。
(我不太感兴趣的某些特定的OSGI实施支持它。)
编辑背景:这样,OSGI捆绑包可以为某些库(SPI)(SPI)
@Reference
是服务组件运行时规范的SCR注释。您必须区分分辨率阶段(安装捆绑包和使其制作 Active )和服务参考接线。
坚持SCR组件 - 您可以想象两个组件,两者都导出(@Service
注释)一些服务并互相引用(使用@Reference
) - 这样您就会陷入死锁状况。
但是您描述的场景似乎很好。
-
bar
从foo
导入软件包 - 因此在foo之后解决了。当然,如果您手动安装捆绑包,然后首先安装bar
,然后安装foo
,则必须刷新/重新启动bar
-
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>
...