解决Gradle中jar冲突

如果有两个依赖引用了相同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
结束!



你可能感兴趣的:(android)