彼はあなたがMavenの達人が競合頼る前の話をする必要があると言う推移の依存関係を。
推移的依存関係
現在のプロジェクトの依存を導入し、依存は、プロジェクトの導入に依存することになります。それを言うために、より正確に、Mavenは、現在のプロジェクトに依存して、フォームを転送する必要が間接的に依存したものを直接依存POMを解決されます。
なぜそれが必要な間接的依存」ですか?すべてではない間接的な依存性が導入されるためです。これは、Mavenの話をしていることはある範囲に依存。
従属範囲
Mavenの導入依存性は、過去にプロジェクトにjarファイルのパッケージをコピーしますが、地元の倉庫へのjarパッケージ、その後、開発クラスパスを通じてプロジェクト内の特定のjarパッケージを導入していません。Mavenは、クラスパスの3セットを管理し、されているCLASSPATHのコンパイル、CLASSPATHをテストし、CLASSPATHを実行します。
依存性の範囲は、三クラスパス、Mavenの依存性の範囲を制御するために使用されます。
- コンパイル:コンパイル依存範囲。すべてのクラスパスの有効な。例:スプリングコア
- テスト:テスト依存範囲。唯一のテストのクラスパスの有効な。例:JUnitの
- 提供:依存範囲を提供しました。コンパイルと効果的なテストのためのクラスパス。例:サーブレットAPI
- ランタイム依存スコープランタイム:クラスパスの効果的なテストと運用。例:JDBCドライバ
- システム:システムは範囲を依存しています。コンパイルと効果的なテストのためのクラスパス。明示的systemPathで指定されました。
- 輸入:輸入依存の範囲。クラスパスへの影響はありません。
レンジ依存クラスパスを制御することに加えて、依存伝送に影響を与えます。Aが従属B、B-C依存である場合、AはBに直接依存する最初のものです。CのBは、第直接依存します。CのAは推移依存関係です。第1の範囲及び第2の直接に直接依存範囲が伝送依存性の範囲を決定依存:結論です。
「Mavenの戦闘」の表には、説明します:
直接依存直接依存第一、第二 |
コンパイル |
テスト | 提供 | ランタイム |
---|---|---|---|---|
コンパイル |
コンパイル |
- |
- |
ランタイム |
テスト |
テスト |
- |
- |
テスト |
提供 |
提供 | - |
提供 | 提供 |
ランタイム |
ランタイム |
- |
- |
ランタイム |
最初の列は最初の直接依存性であり、最初の行は第二に直接依存し、中間範囲は推移的依存性を表しています。
リライアンスと依存関係の紛争調停
それは理由推移依存関係のある、それは紛争をもたらすことに依存してもよいです。そのようなA-> X(1.0)、A-> B-> X(2.0)として。直接依存バージョン1.0 X、A及びBは、従属バージョン2.0 X.に依存します 適切な範囲に依存する場合は、B X依存性のAは、プロジェクトに渡されます。依存性の競合を作成Xの一貫性のない、2つのバージョン。
競合に依存すると、Mavenはエラーを指示しませんが、ルールのセットとする調停に依存しています。2つのルールがあります。
- 最近の優先パス。
- 最初の文が好ましいです。
A-> B-> X(2.0)の長さは、最終バージョン1.0の使用、2であり、そのような1のA-> X(1.0)の長さとして、長さに依存経路依存のプログラムを指すX.
2間のパスと同じ場合は?そのようなA-> B-> X(2.0)とA-> C-> X(3.0)、両方の経路2の長さに依存しているように、それを使用すること?これは、使用する上で最初の文である二番目のルールが必要です。
ほとんどの場合、この自動Mavenの依存関係の調停は、私たちが問題を解決することができます。しかし、時には我々は、手動の取り扱いの競合に依存する必要があります。この競合は両方ではなく2依存関係のため、同じの異なるバージョン(この依存調停を取得することができます)に依存しないことがあります。例えばSLF4J-log4jのためと同時に発生しない依存するが、それらは同じ座標ではないので、それほどMavenの処理のために整列されることはありません両方をlogback。今回は手動でする必要がありますに依存して除外する。
排除して信頼
次の例では、希望妨げない依存、除外例の依存性であるとき、指定されたバージョン:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
:この除外は、間接的な依存性を排除するために同じニーズの多くがある場合、それは多くの問題だろう、来るために非常に便利です、あなたはを参照することができ、「グローバル除外」を達成するためにMavenの依存関係
チェックの依存関係の競合
Mavenの依存性が紛争調停を依存している使用している場合ので、任意のヒントを持っていません。次に、どのように我々はそれをチェックしますか?二つの方法があります。
最初に使用することでmvn dependency:tree -Dverbose
、すべての依存関係、プロジェクトの推移依存関係を一覧表示します。繰り返しや紛争への依存度を求めるプロンプトが表示されますomitted for duplicate
とomitted for conflict with x.x.x
。
第二の方法は、MavenのEnforcerプラグインを使用することです。POMプロジェクトに参加:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<dependencyConvergence/>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
達人でコンパイルするときので、依存関係の競合が存在する場合、エラーメッセージがあること:
[ERROR]
Dependency convergence error for org.slf4j:slf4j-api:1.6.1 paths to dependency are:
-org.myorg:my-project:1.0.0-SNAPSHOT
-org.slf4j:slf4j-jdk14:1.6.1
-org.slf4j:slf4j-api:1.6.1
and
-org.myorg:my-project:1.0.0-SNAPSHOT
-org.slf4j:slf4j-nop:1.6.0
-org.slf4j:slf4j-api:1.6.0
参考資料
- 「Mavenの本当の」
- liuyongpoパーソナルスペースを - - オープンソースコミュニティの中国Mavenの実装では、「グローバル除外」に依存しています
- プッシュクール - Mavenは依存キャンセル渡さ頼ることは禁じ対策を依存しています
この記事は独立したブログのアドレス:トーク達人は、依存依存および配信の範囲に依存紛争調停を頼る|木材杉のブログ