1

osgi アプリケーションで querydsl ライブラリを使用しています。アーティファクト querydsl-jpa には依存関係として hibernate-jpa-2.0-api があります。

休止状態を使用しないため、pom.xml にそのような除外を追加しました。それでも (karaf features.xml ファイルを介して) サービスを開始しようとすると、次のようになります。

コマンド実行エラー: 機能 querydsl-jpa-2.5.0 でバンドル mvn:com.mysema.querydsl/querydsl-jpa/2.5.0 を開始できませんでした: バンドル com.mysema.querydsl.jpa の未解決の制約 [223] : 223.0 を解決できません: 要件 [223.0] パッケージがありません。(&(package=org.hibernate)(version>=3.6.8.Final))

mvn プロジェクトの依存関係: ツリーは休止状態の依存関係を返しません。これは、依存関係が明示的に除外されている場合でも、osgi 依存関係が querydsl バンドルのマニフェスト ファイルによって排他的に決定されることを意味しますか?

    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>2.5.0</version>
        <exclusions>
        <exclusion>
        <groupId>org.hibernate.javax.persistence</groupId>
  <artifactId>hibernate-jpa-2.0-api</artifactId>
        </exclusion>
        </exclusions>
    </dependency>

および features.xml からの抜粋

 <feature name='querydsl-jpa' version='2.5.0'>
  <bundle>mvn:org.apache.felix/org.osgi.compendium/1.4.0</bundle>
  <bundle>mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/1.1</bundle>
  <bundle>mvn:com.mysema.querydsl/querydsl-core/2.5.0</bundle>
  <bundle>mvn:com.mysema.commons/mysema-commons-lang/0.2.2</bundle>
  <bundle>mvn:com.mysema.querydsl/querydsl-sql/2.5.0</bundle>
  <bundle>mvn:com.mysema.querydsl/querydsl-jpa/2.5.0</bundle>
</feature>
4

1 に答える 1

1

pom.xml は、実行時ではなくビルド時に何が起こるかを決定します。pom で宣言された依存関係とマニフェストで宣言された依存関係を混同するのは簡単です。どちらも依存関係を含んでいるように見えますが、実際には大きく異なります。OSGi ランタイムは maven を認識していないか気にしないため、pom ファイルを確認することはありません。OSGi が依存関係について通信する方法は、マニフェストを介して行われます。明らかに、pom の内容はマニフェストの内容に影響を与える可能性がありますが、ビルドするバンドルに対してのみです。ここでは、querydsl バンドルを再構築していないため、マニフェストは同梱されているものです。

そのバンドルが hibernate への依存を宣言している場合、本当に hibernate が必要であると想定する必要があります。依存関係がオプションであることが確実な場合は、バンドルの所有者にバグを報告する必要があります。修正を待っている間、オプションは、バンドルを再構築optional=trueして hibernate バンドルにディレクティブを追加するか、不足している hibernate パッケージをエクスポートするダミー バンドルを作成することです。これにより、querydsl バンドルが開始されますが、このアプローチには非常に注意が必要です。ハックを使用して OSGi の安全メカニズムをバイパスしており、休止状態を使用するコードパスが完全に使用されていない限り、実行時に NoClassDef 例外やその他のエラーが発生するリスクがあります。

于 2012-05-16T17:11:45.750 に答える