別の jar をラップする OSGi サービスを作成しようとしています。jar をプロジェクト、クラスパス、およびバイナリ ビルドに追加しました。サービスを Activator に登録しましたが、使用するバンドルがサービスを呼び出すと、ラッパー jar で java.lang.NoClassDefFoundError が発生します。ここで私が間違っていることを誰かが知っていますか?
前もって感謝します。
コンシューマーが必要とするパッケージと、実装に必要なすべてのパッケージをエクスポートしていますか。コンシューマーは、参照されるすべてのものをインポートする必要があります。
余談ですが、この方法でバンドルを作成すると、開発用の Eclipse ではうまく機能しません (ランタイムでは問題なく機能します)。別の OSGi プロジェクトから jar 内のクラスまたはインターフェースを参照しようとすると、jar 内のファイルを「見る」ことができないため、IDE は何も解決しません。(IDE 内で) すべてを表示するには、バンドル内で jar を展開する必要があります。Eclipse は、ビルド用のインポートとエクスポートに基づいて、適切なクラスパス参照を自動的に作成します。バンドルに jar ファイルがない場合、このクラスパスを明示的に維持する必要があります。
あなたの行動には複数の理由が考えられます。確認するために、次のことを確認します。
マニフェスト エディターの [ビルド] タブに jar が含まれているかどうか、および [クラスパス] の下の [ランタイム] タブ内でこの jar を指定しているかどうかを確認します。
作成されたバンドル: jar が含まれていますか? 「Bundle-ClassPath: lib/myLibrary.jar,.」のように、jar を指す「Bundle-ClassPath」ヘッダーがありますか。(最後の . は、バンドルのルート ディレクトリ (アクティベーター fi) からのクラスを含めるために必要です)
jar に必要なすべての依存関係が実際に含まれているか、ラッピング バンドルの Import-Package ヘッダーを介してそれらを表現していることを確認してください。Eclipse には、そのための「インポート ウィザード」があります。ちなみに、前述の bnd ツールは同じことを行います。それが役立つことを願っています...
マニフェストでBundle-Classpathを使用しましたか?既存のjarファイルにbndを使用しないのはなぜですか?