1

私の目標は、バンドルから OSGi への依存関係を取り除くことです。felix (v 4.2.1) を impl として使用し、組み込み可能に実行します。org.apache.felix.scrService Component Runtime をサポートするために (v. 1.6.2) バンドルをインストールします。しかし、私が走るとき

 ServiceReference ref = bundleContext().getServiceReference(ScrService.class.getName());
 ScrService s = (ScrService) bundleContext().getService(ref);

私は得るClassCastException: org.apache.felix.scr.impl.ComponentRegistry cannot be cast to org.apache.felix.scr.ScrService

わかった。システムパッケージを変更します。

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.apache.felix.scr");

今私は得る

Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle org.apache.felix.scr [1]: Unable to resolve 1.0: missing requirement [1.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.4.0)(!(version>=2.0.0)))
        at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
        at com.copyright.rup.communications.felix.Felix.addBundle(Felix.java:86)
        ... 28 more

どうすれば解決できますか?

4

1 に答える 1

4

あなたが手に入れようとする最初のブロックはScrService、組み込み側にあると思います(つまり、インストールされたバンドル内からではなく、フレームワークの外側です)。

この場合、ScrService埋め込みコードの ClassLoader からロードされた 1 つと、フレームワークによって解決されたときに scr バンドルの ClassLoader によってロードされた 2 つのコピーがあります。これが、 が表示されている理由ですClassCastException

SCR バンドルがフレームワーク バンドルからエクスポートするものをエクスポートするだけです。

OSGi コア仕様 v5のセクション 3.8、ページ 51 には、モジュールに同じパッケージのインポート定義とエクスポート定義の両方がある場合、バンドル ワイヤリングの解決で、フレームワークは最初に外部で解決を試み、成功した場合は重複するエクスポート定義を破棄すると記載されています。

そのため、SCR ランタイム バンドルの Export-Package マニフェスト ヘッダーをフレームワーク プロパティとしてコピーします。

properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, 
        "org.ops4j.pax.url.mvn,org.apache.felix.scr;uses:=\"org.osgi.framework," +
        "org.osgi.service.component\";version=\"1.7\"," +
        "org.apache.felix.scr.component;status=provisional;mandatory:=status;" +
        "uses:=\"org.osgi.service.component\";version=\"1.0\"," +
        "org.osgi.service.component;uses:=\"org.osgi.framework\";version=\"1.2\"");

//Which you pass to the FrameworkFactory ...

ServiceLoader<FrameworkFactory> loader = ServiceLoader.load(FrameworkFactory.class);
Iterator<FrameworkFactory> iterator = loader.iterator();
Framework framework = iterator.next().newFramework(properties);
framework.start();

注意すべき点がいくつかあります。

  • まだ を使用していない場合は、 org.osgi.compendiumConfigurationAdminもインストールして、少なくとも と の API クラスがあることを確認してください。知る限り、これらは SCR ランタイムに必要です。org.osgi.service.cm.*org.osgi.service.metatype*

  • Constants.FRAMEWORK_SYSTEMPACKAGES実際のフレームワークを真剣にカスタマイズしない限り、使用しないでください。代わりに、フレームワーク バンドルによってエクスポートされるものConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA拡張するために使用することをお勧めします。(フレームワークの実装には非常に優れたデフォルトがFRAMEWORK_SYSTEMPACKAGESあり、通常、埋め込み時にこれを変更する必要はありません)。

于 2013-04-22T18:29:45.993 に答える