43

maven-enforcer-plugin を使用して、依存関係の収束の問題を確認します。典型的な出力は次のようになります。

[WARNING] Rule 1: org.apache.maven.plugins.enforcer.DependencyConvergence failed 
  with message:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for junit:junit:3.8.1 paths to dependency are:
+-foo:bar:1.0-SNAPSHOT
  +-ca.juliusdavies:not-yet-commons-ssl:0.3.9
    +-commons-httpclient:commons-httpclient:3.0
      +-junit:junit:3.8.1
and
+-foo:bar:1.0-SNAPSHOT
  +-junit:junit:4.11
]

このメッセージを見て、私は通常、推移的な依存関係を除外することで「解決」します。

<dependency>
  <groupId>ca.juliusdavies</groupId>
  <artifactId>not-yet-commons-ssl</artifactId>
  <version>0.3.9</version>
  <exclusions>
    <!-- This artifact links to another artifact which stupidly includes 
      junit in compile scope -->
    <exclusion>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </exclusion>
  </exclusions>
</dependency>

これが本当に修正であるかどうか、およびこの方法でライブラリを除外することに伴うリスクを理解したいと思います。私の考えでは:

  • 新しいバージョンを使用することを選択している場合、「修正」は通常安全です。これは、下位互換性を維持しているライブラリ作成者に依存しています。

  • 通常、Maven ビルドへの影響はありません (より近い定義が優先されるため) が、依存関係を除外することで、この問題について知っていることを Maven に伝え、maven-enforcer-plugin を緩和します。

私の考えは正しいですか?この問題を処理する別の方法はありますか? 一般的なケースに焦点を当てた回答に興味があります-junit上記の例は少し奇妙です。

4

2 に答える 2

3

アーティファクトとしての JUnit がコンパイル スコープの依存関係として発生している場合、それはライブラリの 1 つのバグです。ここでは ca.juliusdavies.

JUnit は常にテスト スコープに含める必要があります。したがって、ビルドが成功すると、生成された .jar、.war、または .ear ファイルにパックされません。

一般的に言えば、ライブラリ 1 とライブラリ 2 が 1 つの共通の依存関係を共有する場合のように、既に含まれている依存関係を除外しても害はありません。

もちろん、発生する可能性のある唯一の問題は、ライブラリ 1 とライブラリ 2 に同じ依存アーティファクトの異なるバージョンが含まれている場合です。これにより、ライブラリの機能が変更されたときに実行時エラーが発生する可能性があります。幸いなことに、バージョン番号の違いが大きい場合を除き、これはあまり当てはまりません。一般に、最新の依存関係バージョンを含め、古いバージョンを除外することをお勧めします。これはほとんどの場合実行可能です。

そうでない場合は、プロジェクトの第 1 レベルの依存関係に更新があるかどうかを確認してください。

于 2013-04-22T14:46:29.000 に答える