Android依赖-管理依赖的版本

本文转载自原文连接
我主要使用了exclude,使用exculde去除重复的依赖,好比 引入的多个第三方包都包含 okhttp 就可使用该方法去除:
A: compile ‘com.test.aaa’android

B : compile ‘com.test.bbb’web

C: compile ‘com.test.ccc’spring

D: compile ‘com.squarequ.okhttp3’svg

例如 本身的项目中依赖了 okhttp 还依赖了A B C 三个第三方包,A B C 中都依赖了 okhttp ,直接编译 不能经过 报错gradle

Error:Error converting bytecode to dex:hibernate

Cause: com.android.dex.DexException: Multiple dex files define Lokhttp3/Address;rest

这样 就要去除 A B C 中的okhttp ,使用方法code

compile ('com.test.aaa'){

        exclude group'com.squarequ.okhttp3'

}

这样就去掉了A 依赖中的okhttp . B C 同理。xml

什么是传递依赖
  在Maven仓库中,构件经过POM(一种XML文件)来描述相关信息以及传递性依赖。Gradle 能够经过分析该文件获取获取因此依赖以及依赖的依赖和依赖的依赖的依赖,为了更加直观的表述,能够经过下面的输出结果了解。ip

+--- org.springframework:spring-web:4.3.4.RELEASE
|    |    +--- org.springframework:spring-aop:4.3.4.RELEASE
|    |    +--- org.springframework:spring-beans:4.3.4.RELEASE
|    |    +--- org.springframework:spring-context:4.3.4.RELEASE
|    |    \--- org.springframework:spring-core:4.3.4.RELEASE

能够看到,咱们的项目依赖了spring-web,然而spirng-web却依赖了一众spring的全家桶,借助Gradle的传递性依赖特性,你无需再你的脚本中把这些依赖都声明一遍,你只须要简单的一行,Gradle便会帮你将传递性依赖一块儿下载下来。

compile org.springframework:spring-web:4.3.4.RELEASE

传递依赖特性能够轻松地经过transitive参数进行开启或关闭,上面的示例中若是要忽略spring-web的传递性依赖能够采用指定 transitive = false 的方式来关闭依赖传递特性,也能够采用添加@jar的方式忽略该依赖的全部传递性依赖。

compile("org.springframework:spring-web:4.3.4.RELEASE") {
    transitive = false
}

compile org.springframework:spring-web:4.3.4.RELEASE@jar

下面的语句,能够全局性的关闭依赖传递特性。

configurations.all {
   transitive = false
}

排除依赖
   有些时候你可能须要排除一些传递性依赖中的某个模块,此时便不能靠单纯的关闭依赖传递特性来解决了。这时exclude就该登场了,若是说@jar完全的解决了传递问题,那么exclude则是部分解决了传递问题。然而实际上exclude肯能还会用的频率更更频繁一些,好比下面几种状况。

依赖冲突时,若是有两个依赖引用了相同jar包的不一样版本时,默认状况下gradle会采用最新版本的jar包,此时能够经过排除选项来排除。
运行期无需此模块的。
没法正常获取到此传递依赖,远程仓库都不存在的。
版权缘由须要排除的。
其余缘由。
能够经过configuration配置或者在依赖声明时添加exclude的方式来排除指定的引用。

exclude能够接收group和module两个参数,这两个参数能够单独使用也能够搭配使用,其中module能够理解为对应GAV中的artifactId,也就是compile group: ‘org.gradle.test.classifiers’, name: ‘service’, version: '1.0’中的中间name部分。

configurations {
    //编译期排除commons模块
    compile.exclude module: 'commons'
    //在整个构建过程当中排除pkaq.tiger:share
    all*.exclude group: 'pkaq.tiger', module: 'share'
}
 
dependencies {
    compile("pkaq.tiger:web:1.0") {
        exclude module: 'share'
    }       
}

使用强制版本
  固然,有时候你可能仅仅是须要强制使用某个统一的依赖版本,而不是排除他们,那么此时force就该登场了。指定force = true属性能够冲突时优先使用该版本进行解决。

compile('org.hibernate:hibernate:3.1') {
    force = true
}

全局配置强制使用某个版本的依赖来解决依赖冲突中出现的依赖

configurations.all {
   resolutionStrategy {
       force 'org.hamcrest:hamcrest-core:1.3'
   }
}

使用动态版本
  若是你想让你的工程始终采用最新依赖,那么Gradle提供了一种方式能够始终保证采用依赖的最新版本而无需每次手工检查修改版本。
  使用加号+,可让Gradle在每次执行构建时检查远程仓库是否存在该依赖的新版本,若是存在新版本则下载选用最新版本。固然也能够指定依赖某个大版本下的最新子版本,1.+表示始终采用该依赖最新的1.x版本的最新依赖。

compile ‘org.springframework:spring-web:+’

虽然这是看上去十分风骚的一种用法,但这无疑会下降你系统构建的速度同时提升构建失败的风险。由于Gradle不得不每次检查远程仓库是否存在最新版本,同时新版本也可能带来没法预知的兼容性问题,好比quartz2.x较之于quartz1.x,common-lang3较之于common-lang等。

一个综合示例

compile('org.hibernate:hibernate:3.1') {
 // 冲突时优先使用该版本
 force = true
 
 // 依据构建名称排除
 exclude module: 'cglib' 
 // 依据组织名称排除
 exclude group: 'org.jmock' 
 // 依据组织名称+构件名称排除
 exclude group: 'org.unwanted', module: 'iAmBuggy' 
 
 // 为本依赖关闭依赖传递特性
 transitive = false
}