14

永続化サービス (を使用) と構成 (xml ファイル) を含むフラグメントを含むバンドルOSGiがあります。hibernateバンドルのアクティベーターで、次を使用して構成をロードしています。

@Override
public void start(BundleContext ctx) {
   URL url = ctx.getBundle().getResource("hibernate.cfg.xml");
   SessionFactory sessionFactory = new AnnotationConfiguration().configure(url).buildSessionFactory();
}

ただし、場合によってURLは null です。URL利用可能なすべての s を (メソッドを使用して)リストしようとしたときfindEntries、バンドル自体のものは常に利用可能ですが、フラグメントのものは時々しか利用できないように見えました。私はFelix4.0.2 を使用しています。バンドルとフラグメントは同時に開始されFelixます。自動開始レベル。

4

2 に答える 2

23

フラグメントは、ホストが解決された時点でホストにアタッチされます。通常、ホストが解決される前にフラグメントがインストールされている限り、フラグメントはアタッチされます。

ただし、ホストはフラグメントに依存しないため、ホストがフラグメントなしで解決する可能性は常にあります。したがって、通常は、存在しないフラグメントに対処できるようにホストを作成する必要があります。つまり、NPE などをスローしないようにする必要があります。

Require-CapabilityOSGi R4.3 以降、およびProvide-Capabilityヘッダーを使用して、ホストからフラグメントに依存関係を導入できます。依存関係用に独自の名前空間を発明することで、フラグメントに を提供させることができますProvide-Capability。次に、ホストはRequire-Capability.... を使用してそれを要求できます。これで、OSGi フレームワークは、ホストを解決する前にフラグメントが使用可能でなければならないことを確認します。

于 2012-06-14T12:47:41.437 に答える