如果有两个依赖引用了相同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
}
6.再讲一下动态依赖吧,我们有时候会让以来的jar始终是最新版本,并且不用每次手动更改版本,我们可以使用
+
;gradle在每次执行构建时检查远程仓库是否存在该依赖的新版本,如果存在新版本则下载选用最新版本。
compile 'com.common:lib:+'
当然也可以指定依赖某个大版本下的最新子版本,1.+表示始终采用该依赖最新的1.x版本的最新依赖。
compile 'com.common:lib:1.+'
最后啰嗦一下,出现冲突时查看某个冲突jar的依赖关系,可以使用 dependencyInsight,具体用法可以去查找学习一下,举个用例,查看 app项目中v7的compile 出现在何处
gradlew -q app:dependencyInsight --dependency appcompat-v7 --configuration compile
结束!