版本冲突
Gradle提供了两种解决版本冲突的策略:Newest和Fail.默认策略是Newest,配置Fail模式:
configurations.all {
resolutionStrategy.failOnVersionConflict()
}
这两种策略一般能够满足使用,但Gradle提供了颗粒度更细的控制:
强制依赖
configurations.all { //如果有冲突,强制依赖asm-all的3.31版本和commons-io的1.4版本 resolutionStrategy.force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4' }
排除传递中的依赖
dependencies { compile('org.hibernate:hibernate:3.1') { //如果有冲突,强制使用3.1版本 force = true
//排除传递中的依赖 exclude module: 'cglib' //通过artifact的名字排除 exclude group: 'org.jmock' //通过artifact的group名字排除 exclude group: 'org.unwanted', module: 'iAmBuggy' //通过artifact的名字和grop名字排除
//禁止该依赖传递 transitive = false } }
自定义模块优先
有时自己fork了别人的模块,做了修改,此时希望Gradle依赖自己的fork而不是官方的,这是就可以
configurations.all {
resolutionStrategy.preferProjectModules()
}
版本冲突排查
使用命令行”gradle dependencies xxx”可以查看项目的依赖
依赖更新
方案一:自动更新
项目依赖的远程包如果有更新,会有提醒或者自动更新吗? 不会的,需要你手动设置changing标记为true,这样gradle会每24小时检查更新(默认更新时间),通过更改resolutionStrategy可以修改检查周期。
configurations.all { //每隔24小时检查远程依赖是否存在更新 resolutionStrategy.cacheChangingModulesFor 24, 'hours' //每隔10分钟.. //resolutionStrategy.cacheChangingModulesFor 10, 'minutes' // 采用动态版本声明的依赖缓存10分钟 resolutionStrategy.cacheDynamicVersionsFor 10*60, 'seconds' } dependencies { compile('group:module:1.0.0-SNAPSHOT') { changing = true } }
方案二:强制刷新依赖
在执行build、compile等任务时会解析项目配置的依赖并按照配置的仓库去搜寻下载这些依赖。默认情况下,Gradle会依照Gradle缓存->你配置的仓库的顺序依次搜寻这些依赖,并且一旦找到就会停止搜索。如果想要忽略本地缓存每次都进行远程检索可以通过在执行命令时添加
--refresh-dependencies
参数来强制刷新依赖。gradle build --refresh-dependencies