OSGi企业版第5版规范引入了osgi.extender
命名空间。此命名空间使得可以在框架中安装假设包括Blueprint或Declarative Services等扩展程序的bundle,以使用Require-Capability
标头对此依赖项进行建模。
第135.2章 osgi.extender命名空间告诉我们应该在相应的规范中指定每个特定扩展器的功能值。蓝图给出了一个例子:
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
。我假设最终这个值将在规范中正确定义。但在那之前我不能使用它。
由于OSGi Core Release 4.3中引入了Require-Capability
和Provide-Capability
标头,因此框架实现中已经提供了该机制。因此,我希望我的bundle能够表达对SCR的要求,以便可以从OBR存储库中解析SCR实现。
我可以想象一个解决方案,我创建一个空包,一方面提供自定义功能,另一方面需要实现包。例如:
Provide-Capability: com.example.extender; extender=scr
Require-Bundle: org.apache.felix.scr; bundle-version=1.6.0
任何包含声明性服务的bundle都可以表达对此功能的要求。例如:
Require-Capability: com.example.extender; filter:="(extender=scr)"
在部署包含声明性服务的bundle时,这是确保SCR得到解决的好方法吗?还有其他办法吗?
这个问题的一个很好的解决方案是一个解决方案,也可以应用于其他不提供功能的传统捆绑包。
答案 0 :(得分:4)
规范定义了osgi.extender命名空间,但需要更新各种扩展程序规范(Blueprint,DS)以强制实现提供适当的扩展程序功能。现在,他们可能没有。
目前,您的DS捆绑包现在可以“要求”解析(甚至安装)DS实施包。
OSGi正在为Blueprint和DS的下一次更新进行工作,这些更新将强制执行osgi.extender功能。