OSGi 服务与捆绑包启动顺序
OSGi service vs bundle startup sequence
给定两个 OSGi 包 foo
和 bar
,并且:
bar
从 foo
. 导入 (Import-Package:
) 个包
bar
实现了在 foo
. 中定义的服务
是否允许foo
中的服务使用(@Reference
)来自[=的服务11=](根据 OSGi 规范)?
首先解析捆绑包,然后按照满足其依赖关系的顺序启动服务,这在技术上应该是可行的。
(我对某些特定的 OSGi 实现是否支持它不太感兴趣。)
编辑 背景:这样,OSGi 包可以为某些库提供自定义服务实现 (SPI)
@Reference
是服务组件运行时规范的 SCR 注释。
您必须区分 resolution 阶段(安装捆绑包和使其成为 active 之间的过程)和服务引用接线。
坚持使用 SCR 组件 - 你可以想象两个组件,它们都导出(@Service
注释)一些服务并相互引用(使用 @Reference
) - 这样你就会陷入僵局。
但你描述的场景似乎没问题。
bar
从 foo
导入包 - 所以它在 foo 之后解决了。当然,如果你手动安装 bundle,你先安装 bar
然后 foo
,你必须 refresh/restart bar
foo
@Reference
s 来自 bar
的服务 - 这仅意味着 SCR 运行时将在服务可用后激活 foo
中给定的 SCR 组件
Karaf 使用其 功能 为功能包添加了另一层解析(标准 OSGi 解析器)。所以它总是比手动安装包(或将它们全部放到某个 auto-deploy 目录)更好。
还记得一件事。如果不知何故,你的 bundle 得到 Import-Service
(或 Require-Capability
)清单 header(这些可能由 maven-bundle-plugin 生成),解析可能会失败,因为服务通常稍后异步注册,启动捆绑包后(使用蓝图或 scr 运行时)。我个人通常使用此配置摆脱这些 headers:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<_removeheaders>Import-Service,Require-Capability</_removeheaders>
...
</instructions>
...
给定两个 OSGi 包 foo
和 bar
,并且:
bar
从foo
. 导入 (bar
实现了在foo
. 中定义的服务
Import-Package:
) 个包
是否允许foo
中的服务使用(@Reference
)来自[=的服务11=](根据 OSGi 规范)?
首先解析捆绑包,然后按照满足其依赖关系的顺序启动服务,这在技术上应该是可行的。
(我对某些特定的 OSGi 实现是否支持它不太感兴趣。)
编辑 背景:这样,OSGi 包可以为某些库提供自定义服务实现 (SPI)
@Reference
是服务组件运行时规范的 SCR 注释。
您必须区分 resolution 阶段(安装捆绑包和使其成为 active 之间的过程)和服务引用接线。
坚持使用 SCR 组件 - 你可以想象两个组件,它们都导出(@Service
注释)一些服务并相互引用(使用 @Reference
) - 这样你就会陷入僵局。
但你描述的场景似乎没问题。
bar
从foo
导入包 - 所以它在 foo 之后解决了。当然,如果你手动安装 bundle,你先安装bar
然后foo
,你必须 refresh/restartbar
foo
@Reference
s 来自bar
的服务 - 这仅意味着 SCR 运行时将在服务可用后激活foo
中给定的 SCR 组件
Karaf 使用其 功能 为功能包添加了另一层解析(标准 OSGi 解析器)。所以它总是比手动安装包(或将它们全部放到某个 auto-deploy 目录)更好。
还记得一件事。如果不知何故,你的 bundle 得到 Import-Service
(或 Require-Capability
)清单 header(这些可能由 maven-bundle-plugin 生成),解析可能会失败,因为服务通常稍后异步注册,启动捆绑包后(使用蓝图或 scr 运行时)。我个人通常使用此配置摆脱这些 headers:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<_removeheaders>Import-Service,Require-Capability</_removeheaders>
...
</instructions>
...