OSGi服务与捆绑包启动顺序
给定两个OSGi捆绑包OSGi服务与捆绑包启动顺序,osgi,Osgi,给定两个OSGi捆绑包foo和bar,以及: bar从foo导入(导入包:)包 bar实现在foo中定义的服务 是否允许foo中的服务使用(@Reference)来自条的服务(根据OSGi规范) 从技术上讲,首先解析捆绑包,然后按照满足其依赖性的顺序启动服务,这应该是可行的 (我对某些特定的OSGi实现是否支持它不太感兴趣。) 编辑背景:通过这种方式,OSGi捆绑包可以为某些库提供自定义服务实现()@Reference是服务组件运行时规范的SCR注释。 您必须区分解决阶段(安装捆绑包和激活捆
foo
和bar
,以及:
从bar
导入(foo
)包导入包:
实现在bar
中定义的服务foo
foo
中的服务使用(@Reference
)来自条的服务(根据OSGi规范)
从技术上讲,首先解析捆绑包,然后按照满足其依赖性的顺序启动服务,这应该是可行的
(我对某些特定的OSGi实现是否支持它不太感兴趣。)
编辑背景:通过这种方式,OSGi捆绑包可以为某些库提供自定义服务实现()@Reference
是服务组件运行时规范的SCR注释。
您必须区分解决阶段(安装捆绑包和激活捆绑包之间的过程)和服务连接
坚持使用SCR组件-您可以想象两个组件,都导出(@Service
注释)某个服务并相互引用(使用@Reference
),这样您就陷入了死锁状态
但你描述的情况似乎很好
bar
从foo
导入包-因此它在foo之后解析。当然,如果您手动安装捆绑包,首先安装bar
,然后安装foo
,则必须刷新/重新启动bar
foo
@Reference
s来自bar
的服务-这仅意味着SCR运行时将在服务可用后激活foo
中的给定SCR组件
Karaf使用其特性为特性包添加了另一层分辨率(标准OSGi解析器)。因此,这总比手动安装捆绑包(或将它们全部放到某个自动部署目录)要好
还记得一件事。如果bundle以某种方式获得导入服务
(或要求功能
)清单头(这些可能由maven bundle插件生成),解析可能会失败,因为服务通常在启动bundle后异步注册(使用blueprint或scr运行时)。我个人通常使用以下配置删除这些标题:
org.apache.felix
maven捆绑插件
真的
导入服务,需要功能
...
...