gradle依赖冲突
# 如何定位依赖冲突?
- 了解如何定位依赖冲突问题之前,我们先手动制造一个依赖冲突。
我们在 build.gradle 引入两个依赖库:
compile 'org.hibernate:hibernate-core:3.6.3.Final'
compile 'org.slf4j:slf4j-api:1.7.22'
执行一下命令查看依赖报告:
./gradlew :module:dependencies --configuration compile
Gradle 执行结果:
compile - Compile dependencies for 'main' sources (deprecated: use 'implementation' instead).
+--- org.hibernate:hibernate-core:3.6.3.Final
| +--- antlr:antlr:2.7.6
| +--- commons-collections:commons-collections:3.1
| +--- dom4j:dom4j:1.6.1
| +--- org.hibernate:hibernate-commons-annotations:3.2.0.Final
| | \--- org.slf4j:slf4j-api:1.5.8 -> 1.7.22(版本自动提升)
| +--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final
| +--- javax.transaction:jta:1.1
| \--- org.slf4j:slf4j-api:1.6.1 -> 1.7.22(版本自动提升)
\--- org.slf4j:slf4j-api:1.7.22
从上面的执行结果可以看出:Gradle 在构建时,默认会使用最高版本的库,例如依赖 slf4j 最终都会以最高的版本为主。
- Configuration 配置依赖问题
我们前面介绍过,每一个 dependency 依赖都是 Configuration ,那么我们可以遍历ConfigurationContainer,获取 每一个 Configuration 对象,然后处理对应的依赖冲突问题。
下面我们配置,当 Gradle 构建遇到依赖冲突时,就立即构建失败:
configurations.all() {
Configuration configuration ->
//当遇到版本冲突时直接构建失败
configuration.resolutionStrategy.failOnVersionConflict()
}
在点击 build 时,会出现如下错误:

# 如何解决依赖冲突?
在上面依赖的两个库导致的依赖冲突是因为 slf4j 的版本不同导致的,那么我们知道原因之后就可以在依赖时指定不要传入依赖某一个库即可,下面来演示一下如何操作:
方式1:
- 排除传递依赖
compile 'org.slf4j:slf4j-api:1.7.22'
compile ('org.hibernate:hibernate-core:3.6.3.Final'){
//排除某一个库(slf4j)依赖
exclude group: 'org.slf4j',module: 'slf4j-api'
}
- 下面就是排除传递依赖后的结果:
compile - Compile dependencies for 'main' sources (deprecated: use 'implementation' instead).
+--- org.slf4j:slf4j-api:1.7.22
\--- org.hibernate:hibernate-core:3.6.3.Final
+--- antlr:antlr:2.7.6
+--- commons-collections:commons-collections:3.1
+--- dom4j:dom4j:1.6.1
+--- org.hibernate:hibernate-commons-annotations:3.2.0.Final
+--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final
\--- javax.transaction:jta:1.1
- 指定禁止传递依赖
compile('org.hibernate:hibernate-core:3.6.3.Final') {
//指定禁止传递依赖
transitive false
}
compile 'org.slf4j:slf4j-api:1.7.22'
- 查看依赖报告
compile - Compile dependencies for 'main' sources (deprecated: use 'implementation' instead).
+--- org.hibernate:hibernate-core:3.6.3.Final
\--- org.slf4j:slf4j-api:1.7.22
方式2:
- 当遇到依赖冲突时,指定一个版本号
configurations.all() {
Configuration configuration ->
configuration.resolutionStrategy.force(['org.slf4j:slf4j-api:1.6.1'])
//或者这样写
resolutionStrategy.setForcedModules(['org.slf4j:slf4j-api:1.6.1'])
}
作者:未见哥哥
链接:https://www.jianshu.com/p/82de510b40b9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
gradle依赖冲突的更多相关文章
- Android Studio 解决 Gradle 依赖冲突的问题
Android Studio 解决 Gradle 依赖冲突的问题 参考链接: Android Studio(Gradle)解决库依赖冲突问题:http://www.mobibrw.com/2016/3 ...
- Android Studio Gradle依赖冲突
版本冲突 Gradle提供了两种解决版本冲突的策略:Newest和Fail.默认策略是Newest,配置Fail模式: configurations.all { resolutionStrategy. ...
- Gradle依赖的统一管理,解决依赖冲突
看见别人在用implementation rootProject.ext.dependencies["xxxx"]不知道是什么意思,上网查了一下,原来是为了解决或者说预防gradl ...
- Gradle依赖项学习总结,dependencies、transitive、force、exclude的使用与依赖冲突解决
http://www.paincker.com/gradle-dependencies https://docs.gradle.org/current/userguide/dependency_man ...
- 项目中遇到的问题:Gradle传递性依赖冲突
问题描述: 在调用别人接口时,由于他们接口做了拦截处理在使用RestTemplate调用时必须要使用@Qualifier("他们封装好的类"),需要导入jar包 gradle方式导 ...
- Android使用gradle依赖管理、依赖冲突终极解决方案(转)
Android使用gradle依赖管理.依赖冲突终极解决方案在Android开发中,相信遇到关于版本依赖的问题的同学有不少.虽然Android Studio一般都会自动帮我们去重,但是有时候去重失败了 ...
- Maven提高篇系列之(五)——处理依赖冲突
这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...
- Android Gradle 依赖配置:implementation & api
背景: Android Gradle plugin 3.0开始(对应Gradle版本 4.1及以上),原有的依赖配置类型compile已经被废弃,开始使用implementation.api和anno ...
- Maven提高篇系列之五——处理依赖冲突
个人分类: Maven 不知道你在使用Maven时是否遇到过诸如"NoSuchMethodError"或"ClassNotFoundException"之类的问 ...
随机推荐
- Java基础00-数组9
1. 数组定义格式 1.1 数组概述 1.2 什么是数组 1.3 数组定义格式 推荐使用第一种格式,因为第一种格式读法比较顺畅. 2. 数组初始化之动态初始化 2.1 数组初始化概述 2.2 数组初始 ...
- Kubernetes实战:高可用集群的搭建和部署
摘要:官方只提到了一句"使用负载均衡器将 apiserver 暴露给工作节点",而这恰恰是部署过程中需要解决的重点问题. 本文分享自华为云社区<Kubernetes 高可用集 ...
- Java项目调试技巧及版本控制
开发项目中,调试是必不可少的. 本篇博客从以下4个方面介绍项目调试技巧: 响应状态码的含义 服务端断点调试技巧 客户端断点调试技巧 设置日志级别,并将日志输出到不同的终端 以及,最后简单的介绍了一下g ...
- mybatis-5-关联查询
外键查询 1.回忆外键约束 注意要在tbl_dept中添加外键 #添加外键约束 # 此处Employee为外键表,dept为主键表 # 删除Employee的数据不会影响dapt,而删除dept一定会 ...
- Thinkphp大批量插入数据库的处理方法和速度对比
最近在使用TP框架写一个读取excel数据并将其插入到mysql数据库中的小功能.当excel中的数据条数非常多(几千甚至上万),并且多很多个列,并且某些列的内容还非常多的时候就容易出现问题. 第一种 ...
- 测试龙芯 LoongArch .NET之 使用 FastTunnel 做内网穿透远程计算机
龙芯3A5000 已经上市,与龙芯3A5000配套的三大编译器GCC.LLVM.GoLang和三大虚拟机Java.JavaScript..NET均已完成开发,从老伙计哪里搞来一台3A5000 机器,安 ...
- WCF简单Demo
WCF,光看书的原理,稍微有点枯燥,通过自己动手,会更容易理解契约声明,面向服务,分布式等概念. 1.创建WCF服务. 2.WcfService1.CS中声明新的契约. namespace WcfSe ...
- Drupal Drupalgeddon 2 远程代码执行漏洞(CVE-2018-7600)
影响版本 Drupal 6.x,7.x,8.x Drupal 是一款用量庞大的CMS,其6/7/8版本的Form API中存在一处远程代码执行漏洞 脚本检测
- 每个程序员的必经之路:Hello,world!
每个程序员的必经之路:Hello,world! Java 源程序 也称源代码,是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令. 在现代程序语言中,源代码可以是以 ...
- Jenkins自动化部署最完整教程
1.概述 Jenkins 是一个可扩展的持续集成引擎.主要用于持续.自动地构建/测试软件项目.监控一些定时执行的任务.Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行 ...