2009-08-13 9 views
3

私はOSGiのクラスの可視性について混乱しています。私は、Apacheフェリックスを実行すると、以下のバンドルロードしています:javax.persistence 1.99 OSGi環境では、クラスパスとクラスローダーはどのように設定されていますか?

  • とOSGiの-fiedが瓶のためのEclipseLink
  • から

    • antlrasmjpacoreバンドルのOSGi-fiedが瓶をcom.mysql.jdbcドライバ
    • 注釈付きエンティティクラスとを呼び出し、自分のpersistence.xml
    • 別のバンドルが含まれている私自身のバンドル210

    ここで、私が混乱しているのは、どのバンドルがMySQLドライバを見ることができるかということです。私はこれがEntityManagerFactoryを作成するバンドルだと考えましたが、そのマニフェストでインポートするとClassNotFoundエラーが発生します。次に、eclipselink jpaバンドルのマニフェストからインポートしようとしましたが、もう一度間違っています。永続性ユニット(エンティティクラスとpersistence.xml)を含むバンドルのマニフェストからインポートした場合にのみ動作します。

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

    私はこれについての簡単な文書を見つけることができないようです。 These slidesはいくつかのヒントを示していますが、正確には包括的ではありません。

  • 答えて

    3

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

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

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

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

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

    +0

    私はcreateEntityManagerFactoryにプロパティとしてドライバを渡しているが、私はそれは同じことだと思いますか?どういうわけかこれは私にとっては奇妙なようです。すべてのdb固有のものを扱う永続化プロバイダであるべきではありませんか? –

    +0

    すべての永続性プロバイダには、JDBCインタフェースを処理できるDBドライバが必要です。そうすれば、バンドル間の結合を低く抑えることができます。使用するDBの選択はアプリケーション固有であるため、コード/設定の一部にする必要があります。これはOSGiの基本パターンです。インタフェースは契約として使用され、一部のバンドルはドメインまたはアプリケーション固有の実装を提供します。 – SteveD

    関連する問題