コンポーネントにサービス参照を挿入するために、OSGI felix プラットフォームで SCR フレームワークを使用しています。オプションの依存関係を除いて、これはうまく機能します。したがって、Foo と Bar の 2 つのコンポーネントがある場合、Foo は以下のようになります。
@Component
public class FooImpl implements Foo {
Log log = LogFactory.getLog(this.getClass());
@Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY)
Bar bar;
public void bindBar(Bar bar) {
log.info("bar bound: "+bar);
}
public void unbindBar(Bar map) {
log.info("bar unbound: "+bar);
}
@override
public void fooHello() {
log.info("Hello, this is an implementation of Foo");
}
}
Bar のインターフェースを定義するバンドルが私の OSGi プラットフォームにデプロイされている限り、これは機能します。プラットフォームで Bar 実装コンポーネントがアクティブ化されていない場合でも、SCR は問題なく、もちろん Bar 実装を参照せずに、私の FooImpl コンポーネントをアクティブ化します。ただし、Bar インターフェイスがプラットフォームにデプロイされていない場合、コンポーネントのアクティブ化中に SCR がクラッシュします。これは、おそらくリフレクションによるコンポーネントの検査からの例外が原因ですが、それを明確に判断することはできませんでした。
では、これらのオプションの OSGi 依存関係から来るインターフェイスへのオプションの参照を持つ SCR コンポーネントを含む、プラットフォームに存在しないオプションの依存関係を持つ OSGI バンドルを展開する方法はありますか?