osgi - 如何声明对 SCR 扩展器能力的要求?

标签 osgi declarative-services

OSGi Enterprise 第 5 版规范引入了 osgi.extender命名空间。此命名空间使假定框架中安装了诸如蓝图或声明性服务之类的扩展程序的包能够使用 Require-Capability 对该依赖项进行建模。标题。

第 135.2 章 osgi.extender Namespace 告诉我们每个特定扩展器的能力值应该在相应的规范中指定。为蓝图提供了一个示例:

Provide-Capability: osgi.extender;
  osgi.extender="osgi.blueprint";
  uses:="org.osgi.service.blueprint.container,org.osgi.service.blueprint.reflect"
  version:Version="1.0"

但是,第 112 章声明性服务规范并未指定 SCR 实现提供的功能。

Peter Kriens 在 blog post on Requirements and Capabilities 中给出了一个例子这表明 SCR 的能力是 osgi.component .我假设最终这个值将在规范中正确定义。但在那之前我无法使用它。

Require-CapabilityProvide-Capability头文件是在 OSGi Core Release 4.3 中引入的,该机制已经在框架实现中可用。因此,我希望我的包表达对 SCR 的要求,以便可以从 OBR 存储库解析 SCR 实现。

我可以想象一个解决方案,我创建一个空包,一方面提供自定义功能,另一方面需要一个实现包。例如:
Provide-Capability: com.example.extender; extender=scr
Require-Bundle: org.apache.felix.scr; bundle-version=1.6.0

任何包含声明性服务的捆绑包都可以表达对此功能的需求。例如:
Require-Capability: com.example.extender; filter:="(extender=scr)"

当我部署包含声明性服务的包时,这是确保解决 SCR 的好方法吗?有没有其他办法?

这个问题的一个很好的解决方案是一个也可以应用于其他不提供功能的遗留包的解决方案。

最佳答案

该规范定义了 osgi.extender 命名空间,但需要更新各种扩展器规范(Blueprint、DS)以强制实现提供适当的扩展器功能。现在,他们可能不会。

所以现在,您的 DS 包现在有办法“要求”解析(甚至安装)DS 实现包。

OSGi 正在进行 Blueprint 和 DS 的下一次更新,这些更新将强制要求 osgi.extender 功能。

关于osgi - 如何声明对 SCR 扩展器能力的要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056898/

相关文章:

java - OSGi 中的回调和传递对象引用

apache - 要使用 ServiceMix,我的项目必须是 OSGi 包吗?

java - 将资源文件添加到 karaf 类路径

java - 尝试在 OSGI 中创建抽象包

java - 您如何在 OSGi 中正确地将 ManagedServiceFactory 实现为声明式服务?

java - Apache Felix SCR @Reference 速查表

java - 如何在 OSGI Declarative Services Annotations 中使用 java 属性文件

android - 完整的Android对OSGi bundle 的支持

osgi - 在 Karaf 中添加新的 mvn url 失败, repo 规范为空

java - OSGi:如果不取消服务会发生什么