如果有两个依赖引用了相同jar包的不同版本时,默认情况下gradle会采用最新版本的jar包,此时可以通过排除选项来排除。
首先,看一下依赖一个库时的格式,name也就是module
- compile group:'com.android.support',name:'appcompat-v7',version:'26.1.0'
1.直接在configuration中排除
- configurations{
- //编译期排除appcompat-v7
- compile.exclude module: 'appcompat-v7'
- //在整个构建过程中排除com.android.support:appcompat-v7
- all*.exclude group: 'com.android.support', module: 'appcompat-v7'
- }
2.在具体的某个dependency中排除,比如我们引入的jar包com.common:lib:1.0中需要排除其中的appcompat-v7
- dependencies{
- compile 'com.common:lib:1.0'{
- exclude module: 'appcompat-v7'
- //或者
- exclude group: 'com.common',module: 'appcompat-v7'
- }
- }
排除多个jar可以使用多个exclude
3.当然,我们也可以强制使用某个统一的版本。出现冲突时优先使用该版本进行解决
- compile('com.common:lib:1.0') {
- force = true
- }
4.强制使用某个统一版本的依赖,我们也可以全局配置
- configurations.all {
- resolutionStrategy {
- force 'com.common:lib:1.0'
- }
- }
5.讲到这里,不得不说一下transitive,它是管理以来的传递性的,比如com.common:lib:1.0中使用了okhttp,如果可以传递,则使用时他会自动为我们加入okhttp,如果不可以传递,则需要额外配置okhttp
关闭依赖传递
- compile('com.common:lib:1.0') {
- transitive = false
- }
也可以采用添加@jar的方式忽略该依赖的所有传递性依赖
- compile `com.common:lib:1.0@jar`
当然也可以全局配置关闭依赖传递
- configurations.all {
- transitive = false
- }
- compile 'com.common:lib:+'
- compile 'com.common:lib:1.+'
最后啰嗦一下,出现冲突时查看某个冲突jar的依赖关系,可以使用 dependencyInsight,具体用法可以去查找学习一下,举个用例,查看 app项目中v7的compile 出现在何处
- gradlew -q app:dependencyInsight --dependency appcompat-v7 --configuration compile
本文出自 CSDN:
https://blog.csdn.net/cdye_1234/article/details/80103128