0

別の jar をラップする OSGi サービスを作成しようとしています。jar をプロジェクト、クラスパス、およびバイナリ ビルドに追加しました。サービスを Activator に登録しましたが、使用するバンドルがサービスを呼び出すと、ラッパー jar で java.lang.NoClassDefFoundError が発生します。ここで私が間違っていることを誰かが知っていますか?

前もって感謝します。

4

3 に答える 3

2

コンシューマーが必要とするパッケージと、実装に必要なすべてのパッケージをエクスポートしていますか。コンシューマーは、参照されるすべてのものをインポートする必要があります。

余談ですが、この方法でバンドルを作成すると、開発用の Eclipse ではうまく機能しません (ランタイムでは問題なく機能します)。別の OSGi プロジェクトから jar 内のクラスまたはインターフェースを参照しようとすると、jar 内のファイルを「見る」ことができないため、IDE は何も解決しません。(IDE 内で) すべてを表示するには、バンドル内で jar を展開する必要があります。Eclipse は、ビルド用のインポートとエクスポートに基づいて、適切なクラスパス参照を自動的に作成します。バンドルに jar ファイルがない場合、このクラスパスを明示的に維持する必要があります。

于 2009-04-20T14:02:49.787 に答える
1

あなたの行動には複数の理由が考えられます。確認するために、次のことを確認します。

  • マニフェスト エディターの [ビルド] タブに jar が含まれているかどうか、および [クラスパス] の下の [ランタイム] タブ内でこの jar を指定しているかどうかを確認します。

  • 作成されたバンドル: jar が含まれていますか? 「Bundle-ClassPath: lib/myLibrary.jar,.」のように、jar を指す「Bundle-ClassPath」ヘッダーがありますか。(最後の . は、バンドルのルート ディレクトリ (アクティベーター fi) からのクラスを含めるために必要です)

  • jar に必要なすべての依存関係が実際に含まれているか、ラッピング バンドルの Import-Package ヘッダーを介してそれらを表現していることを確認してください。Eclipse には、そのための「インポート ウィザード」があります。ちなみに、前述の bnd ツールは同じことを行います。それが役立つことを願っています...

于 2009-04-18T10:21:52.190 に答える
0

マニフェストでBundle-Classpathを使用しましたか?既存のjarファイルにbndを使用しないのはなぜですか?

于 2009-04-18T02:51:55.327 に答える