管理依存の最も重要な問題は、推移的依存のプロセスにおけるバージョンの競合の処理です。以前の手動管理の依存関係プロセスでは、バージョンの競合が頻繁に発生しました。バージョンが競合するとすぐにプログラムを実行できませんでした。バージョン管理ツールとして、この問題を解決する機能が必要です。
推移的な依存関係におけるバージョン競合問題の例:
compile group:'org.hibernate',name:'hibernate-core',version:'3.6.3.Final'
hibernateはhibernate-commons-annotations.jarに依存し、slf4jに依存します。現在のhibernateフレームワークもslf4jに依存します。依存関係の推移性の特性により、jarパッケージの2つの異なるバージョンが依存するため、バージョンの競合の問題が発生します
バージョン競合の解決
Mavenバージョンの競合の自動解決
Mavenと比較すると、推移的な依存関係バージョンの競合を自動的に処理します。Mavenは、
最短パスの原則と優先度宣言の原則に従って最短パスの原則を処理し
ます。D1パスは次のとおりです:プロジェクト-> A-> D1
D2パスは次のとおりです:プロジェクト-> B-> E1- > D2
D1パスはD2より短いため、D1を使用し
て原則を最初に宣言します
。E1とE2は同じパス距離を持ち、E1はE2の前に宣言されるため、E2の代わりにE1が使用されます。
Gradleバージョンの競合解決
Gradleのバージョンの競合を自動的に解決するデフォルトのソリューションは、最も高いバージョンを選択することです。通常、より高いバージョンはより低いバージョンと下位互換性があるため、このオプションは新しいバージョンの機能を使用でき、簡単に間違いを犯すことはありません。
バージョンの競合を手動で解決する
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group:'org.hibernate',name:'hibernate-core',version:'3.6.3.Final'
}
最初にheibernateを参照して、依存関係を確認します
。参照されたslf4jがバージョン1.6.1であることがわかります。
構成戦略を変更し、すべてのjarの競合を自動的に解決します。
configurations.all{
resolutionStrategy{
//修改gradle不自动处理版本冲突
failOnVersionConflict()
}
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group:'org.hibernate',name:'hibernate-core',version:'3.6.3.Final'
}
Gradleを更新します。
Could not resolve all dependencies for configuration ':compileClasspath'.
A conflict was found between the following modules:
- org.slf4j:slf4j-api:1.6.1
- org.slf4j:slf4j-api:1.5.8
Run with:
--scan or
:dependencyInsight --configuration compileClasspath --dependency org.slf4j:slf4j-api
to get more insight on how to solve the conflict.
上記の構成では、gradleがバージョンの競合を自動的に処理できず、ビルドで例外がスローされます。この操作では、どのjarにバージョンの競合があるかを確認できます。
jarパッケージの推移的な依存関係を除外します。
例としてslf4jを取り上げます。
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile (group:'org.hibernate',name:'hibernate-core',version:'3.6.3.Final') {
exclude group:'org.slf4j', module:'slf4j-api'
}
}
依存関係をもう一度
見てください。プロジェクトがslf4j-api jarパッケージのどのバージョンにも依存していないことがわかります。必要なバージョンのjarパッケージを自分で構成する必要があります
jarのすべての推移的な依存関係を除外します(非推奨)
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile (group:'org.hibernate',name:'hibernate-core',version:'3.6.3.Final') {
transitive = false
}
}
jarバージョンを手動で指定する
configurations.all{
resolutionStrategy{
force 'org.slf4j:slf4j-api:1.7.24'
}
}