OSGi Enterpriseリリース5仕様では、osgi.extender
名前空間が導入されています。この名前空間により、BlueprintやDeclarative Servicesなどのエクステンダーがフレームワークにインストールされていることを前提とするバンドルが、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は、要件と機能に関するブログ投稿で、SCRの機能がであることを示唆する例を示していますosgi.component
。最終的に、この値は仕様で適切に定義されると思います。でもそれまでは使えません。
Require-Capability
およびProvide-Capability
ヘッダーはOSGiCoreリリース4.3で導入されたため、このメカニズムはフレームワークの実装ですでに使用可能です。そのため、SCRの実装をOBRリポジトリから解決できるように、バンドルでSCRの要件を表現する必要があります。
空のバンドルを作成し、一方ではカスタム機能を提供し、他方では実装バンドルを必要とする1つのソリューションを想像できます。例えば:
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が確実に解決されるようにするための良い方法ですか?他に方法はありますか?
この問題の適切な解決策は、機能を提供しない他のレガシーバンドルにも適用できる解決策です。