Gradle之解决版本冲突
依赖的传递性给我们带来了便利,同时也会造成版本冲突问题。
解决办法:
- 查看依赖报告
- 排除传递性依赖
- 强制版本冲突
除了上面我们自己解决冲突,gradle也会帮助我们解决,当我们引入多个版本jar时,它默认是最高版本的jar。
解决办法
修改默认策略
configurations.all{ resolutionStrategy{ // 修改gradle不处理版本冲突 failOnVersionConflict() } }
排除传递性依赖
compile('org.hibernate:hibernate-core:3.6.3.Final'){ // module是坐标里面的name exclude group:"org.slf4j" , module:"slf4j-api" // transitive=false }
Transitive用于自动处理子依赖项。默认为true,gradle自动添加子依赖项,形成一个多层树形结构;设置为false,则需要手动添加每个依赖项,
不推荐transitive=false
compile('org.hibernate:hibernate-core:3.6.3.Final'){ transitive=false }
强制指定一个版本
configuration.all{ resolutionStrategy{ force 'org.slf4j:slf4j-api:1.7.24' } }
实战测试
进行如下配置,hibernate与logback都会依赖于slf4j-api的。
dependencies {
compile 'ch.qos.logback:logback-examples:1.3.0-alpha4'
compile 'org.hibernate:hibernate-core:3.6.3.Final'
}
一、默认解决
1)当我们执行Tasks – help – dependencies分析依赖,可以看到gradle帮我们直接解决依赖,将其升级到最高版本
2)当我们修改默认策略关闭时,就会发现出错
configurations.all{
resolutionStrategy{
// 修改gradle不处理版本冲突
failOnVersionConflict()
}
}
执行Tasks – help – dependencies分析依赖,如下。同时我们也build报错。
A conflict was found between the following modules:
- org.slf4j:slf4j-api:1.6.1
- org.slf4j:slf4j-api:1.8.0-beta1
二、排除传递性依赖
关闭默认策略,添加排除依赖。
如下,我们直接排除hibernate的依赖slf4j-api,slf4j-api的jar仅由logback提供。
dependencies {
compile 'ch.qos.logback:logback-examples:1.3.0-alpha4'
compile('org.hibernate:hibernate-core:3.6.3.Final'){
// module是坐标里面的name
exclude group:"org.slf4j" , module:"slf4j-api"
}
}
分析依赖:
三、强制指定一个版本
如下,我们直接指定引入的slf4j-api的jar。
configurations.all{
resolutionStrategy{
force 'org.slf4j:slf4j-api:1.7.24'
}
}
dependencies {
compile 'ch.qos.logback:logback-examples:1.3.0-alpha4'
compile 'org.hibernate:hibernate-core:3.6.3.Final'
}
分析依赖:
如上我们学习了gradle的高级应用上篇,是不是有点激动了,想要学习多项目是如何构建的了?没错,干货就在下篇。一鼓作气,接下去。