Netbeans の OSGi、サービス取得時の ClassCastException
-
12-09-2019 - |
質問
ClassLoaderの問題があります。私はかなりのOSGI初心者なので、答えがそれほど難しくないといいのですが:)
それはコンパイルとランタイムライブラリ。Netbeans 6.7.1 プロジェクト プロパティでは、コンパイル時ライブラリは常に他のカテゴリに伝播されます。だからそこは区別できない。
FelixHost をコンパイルするときに次の jar が使用されます
- Felix.jar
- osgi-core.jar
- osgi-compendium.jar
- osgi.service.obr-1.0.2.jar
ただし、実行時に、フレームワークは OBR の実装をロードします。この OBR バンドルにはインターフェイス定義も含まれています。これが classCastException が発生する理由だと思います。
私は実際にFelixhostがOBRと協力して、最初のプロビジョニングを行うことを望んでいます。
あらゆるアイデアを歓迎します。
解決
「FelixHost」とは、Felix フレームワークをカプセル化して起動するプロジェクトを指していると思います。
問題は、「OSGi ワールド」と「非 OSGi ワールド」の境界について少し注意する必要があることです。FelixHost のクラスパスに置いたものすべて (すなわち、また、あなたの場合のすべてのコンパイル時の依存関係も)本質的にOSGiの世界の外に存在するため、この方法で「osgi.service.obr-1.0.2.jar」のようなバンドルを使用することはお勧めできません。
指摘したように、OSGi フレームワークが「osgi.service.obr-1.0.2.jar」バンドルもロードする場合、基本的に同じクラス (インターフェイス) の 2 つのバージョンがあるため、ClassCastException が発生します。
この問題に対する考えられる解決策の 1 つは、初期プロビジョニング ロジックを別のバンドルに分離し、OBR 関連の作業を実行することです。 OSGi ワールド内から. 。その後、「osgi.service.obr-1.0.2.jar」に対する FelixHost のコンパイル依存関係を削除し、OBR インターフェイスのコピーを 1 つだけロードすることができます。