OSGi服务与捆绑包启动顺序

OSGi服务与捆绑包启动顺序,osgi,Osgi,给定两个OSGi捆绑包foo和bar,以及: bar从foo导入(导入包:)包 bar实现在foo中定义的服务 是否允许foo中的服务使用(@Reference)来自条的服务(根据OSGi规范) 从技术上讲,首先解析捆绑包,然后按照满足其依赖性的顺序启动服务,这应该是可行的 (我对某些特定的OSGi实现是否支持它不太感兴趣。) 编辑背景:通过这种方式,OSGi捆绑包可以为某些库提供自定义服务实现()@Reference是服务组件运行时规范的SCR注释。 您必须区分解决阶段(安装捆绑包和激活捆

给定两个OSGi捆绑包
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捆绑插件
    真的
    导入服务,需要功能
    ...
    ...