3

OSGi でのクラスの可視性について混乱しています。Apache Felix を実行しており、次のバンドルをロードしています。

  • antlrasmおよびeclipselinkjpaのバンドルcore
  • javax.persistence1.99用の OSGi-fied jar
  • com.mysql.jdbcドライバーを含む OSGi-fied jar
  • 注釈付きのエンティティ クラスとpersistence.xml
  • 呼び出す私自身の別のバンドルPersistence.createEntityManagerFactory(String, Map)

さて、私が混乱しているのは、どのバンドルが MySQL ドライバーを認識できる必要があるかということです。これは EntityManagerFactory を作成するバンドルだと思っていましたが、そのマニフェストにインポートすると ClassNotFound エラーが発生します。jpa次に、eclipselinkバンドルのマニフェストからインポートしようとしましたが、やはり失敗しました。永続化ユニット (エンティティ クラスおよびpersistence.xml) を含むバンドルのマニフェストからインポートした場合にのみ機能します。

そのため、PU のバンドルのクラスローダによってデータベース ドライバが検索されているように見えますが、それは私には意味がありません。どうしたの?

これに関する簡単なドキュメントが見つからないようです。これらのスライドはいくつかのヒントを提供しますが、完全に網羅しているわけではありません。

4

2 に答える 2

3

このpdfは、クラスローディングに関して非常に有益であることがわかりました:http: //www.martinlippert.org/events/WJAX2008-ClassloadingTypeVisibilityOSGi.pdf

于 2009-08-31T07:21:34.237 に答える
3

私は Hibernate と JDBC に関する OSGi クラスパスの問題に精通しており、リンク先のスライドに基づいて、何が起こっているのかを説明できます。

JDBC ドライバーのエントリをpersistence.xmlPU バンドル内に追加したと思いますか?

EclipseLink はエクステンダーパターンを使用して、PU バンドルに代わって作業を行います。エクステンダーはバンドルの開始をリッスンし、persistence.xml があるかどうかを確認してから、それを設定する作業を行います。PU バンドルは、JDBC ドライバーを含め、persistence.xml で参照できるすべてのタイプをインポートする必要があります。

考えてみてください。EclipseLink バンドルは、既知のすべての JDBC ドライバーをインポートするわけではありません (そうすべきではありません)。必要なデータベース ドライバーを知ることができるのはバンドルだけなので、PU バンドルが JDBC ドライバー クラスをインポートすることを期待するのは合理的です。

EclipseLink などのサードパーティ ライブラリが既に OSGi 化されている場合は、サードパーティ ライブラリのマニフェストを変更する必要はありません。

于 2009-08-14T13:47:30.727 に答える