2

問題

FelixOSGiコンテナーでOSGiバンドルアクティベーターをインスタンス化する際に問題が発生しました。org.osgi.framework.BundleActivatorバンドルを開始しようとすると、プロジェクトで親クラスが定義されているにもかかわらず、アクティベータータイプをキャストできないというエラーが発生します。

org.osgi:org.osgi.core:5.0.0アクティベーターを持つクラスを開始できるように、アクティベートされたバンドルに含めました。OSGiバンドル内のOSGiライブラリを参照する必要がありますか、それともFelixコンテナがそれらを提供する必要がありますか?

Felix Embeddedを実行している場合でも、コマンドラインから実行している場合でも同じ問題が発生します。

** 解決 **

FelixのOSGiのバージョンは最新の標準よりも古いことがわかりました。私はOSGiを初めて使用するので、最新のものをすべて入手して開発を開始しました。バージョン5.0.0から4.3.0に戻しました。私が気付いた唯一の違いは、APIに優れたジェネリックがないことです。

私のクラスは互換性があるので、コンテナで開始すると解決できます。以前の問題は、ライブラリのバージョンが原因でした。

バックグラウンド

org.osgi.framework(vesrion> = 1.7.0)(!(version> = 2.0.0))への依存関係が見つからなかったために開始されなかったMavenビルドプロジェクトがあります。

プロジェクトの構成は

Main
  SubProjectApi
  SubProjectImpl
  SubProjectIntegrationTest

SubProjectImplがSubProjectApiに依存している場合。SubProjectApiには、maven-bundle-pluginを使用して構築されたバンドルがありますが、OSGi参照は含まれていません。SubProjectImplはApiモジュールを参照し、BundleActivatorを提供します。OSGiクラスを解決するために、プロジェクトにはに依存関係がありorg.osgi:org.osgi.core:5.0.0ます。すべてが正常にコンパイルされます。

プロジェクトSubProjectIntegrationTestは、SubProjectImplが組み込みFelix環境内で正しく機能することを確認するための一連の単体テストを提供します。インスタンスを設定するためのガイドに従いましたFelix(アクティベーターの作成、必要なJarの参照など)。テスト環境とOSGiの両方に同じAPIクラスが必要なため、APIクラスを共有するためにorg.osgi.framework.system.packages.extra構成オプションを使用しました。

テストを開始すると、次のエラーが発生しました

ERROR: Bundle dsto.lod.simr.core [12] 
    Error starting file:target/SubProjectImpl.jar 
    (org.osgi.framework.BundleException: Unresolved constraint in bundle
    project.impl [12]: Unable to resolve 12.0: 
    missing requirement [12.0] osgi.wiring.package; 
    (&(osgi.wiring.package=org.osgi.framework)(version>=1.7.0)(!(version>=2.0.0))))

Felix環境がそれらのクラスを自動的に提供すると思いました。org.osgi.coreモジュールを環境に追加したところ、問題はキャストタイプで発生した問題に変わりました。

4

2 に答える 2

4

Core API バンドルはインストールしないでください。これらのパッケージは、フレームワークの実装によってエクスポートされます。バンドルをインストールし、バンドルに対して解決する場合、バンドルとフレームワークの実装は、これらのクラスに対して異なる Class オブジェクトを使用します。

また、フレームワークの実装でサポートされているバージョン以下のバージョンのコア API に対してコンパイルする必要があります。フレームワークの実装はコア 4.3 (または 5.0 より下の他のバージョン) 用ですが、コア 5.0 に対してコンパイルしたようです。

于 2012-09-13T12:10:13.407 に答える