假如有三个三方依赖库:A,B,C,这三个库都引用了D,但是A引用的是D1.1,B引用的是D1.2,C引用的是D1.3…想让A、B、C都应用D2。有以下三种方法:
- 使用 dependencyResolutionStrategy.force 强制指定版本
在项目的 build.gradle 文件的 allprojects 或 subprojects 配置中,使用 dependencyResolutionStrategy,强制所有使用 D 的地方都采用 2.0 版本。
这会使项目和所有第三方库强制使用 D:2.0 版本,而忽略 A、B、C 自带的不同版本
allprojects {configurations.all {resolutionStrategy {force 'com.example:D:2.0' // 替换为 D 的 Maven 坐标}}
}
- 使用 constraints 统一依赖版本(Gradle 5.0 及以上)
在 dependencies 中使用 constraints 声明 D 的版本约束,确保所有模块和第三方库都使用 D:2.0
dependencies {implementation 'com.example:A:1.0' // 引入库 Aimplementation 'com.example:B:1.0' // 引入库 Bimplementation 'com.example:C:1.0' // 引入库 Cconstraints {implementation('com.example:D:2.0') {because '统一使用 D 的 2.0 版本'}}
}
- 手动排除旧版本并显式添加新版本
如果不想强制所有依赖使用同一版本,还可以手动将 A、B、C 中的 D 旧版本排除掉,并显式地添加 D:2.0
dependencies {implementation('com.example:A:1.0') {exclude group: 'com.example', module: 'D' // 排除 A 引用的 D 版本}implementation('com.example:B:1.0') {exclude group: 'com.example', module: 'D' // 排除 B 引用的 D 版本}implementation('com.example:C:1.0') {exclude group: 'com.example', module: 'D' // 排除 C 引用的 D 版本}// 显式引入 D 统一版本implementation 'com.example:D:2.0'
}
另外:检查项目依赖关系,可以用这个命令,生成整个项目的依赖树
./gradlew app:dependencies dependencies.txt // 会在本地生成dependencies.txt文件。
./gradlew build --scan // 生成的依赖关系会在给定的网址上。