Gradle 使用技巧(四) - 如何定位和解决依赖冲突
1. 前言
随着业务的复杂度加深,我们免不了要引入许多的第三方开源库,也不可避免的会出现依赖冲突的错误。最常见的是V7、V4包之间的冲突。
2. 如何定位依赖冲突
解决依赖冲突很简单,难得是如何去定位是引入的哪个库导致的依赖冲突。 如果只想看结果的可以直接跳到最后。
2.1. 排除法
排除法很简单,但是很耗时,就是选择一个依赖一个依赖的注释、编译、看结果。当然这也是最傻的办法,我们开发者怎么能做这种繁琐的工作呢?(说得我好像我自己没做过似的。。
)
2.2. Gradle Task
Android Studio虽然给我们提供了一个依赖树,但也只是一个总的平面图,并不是十分的直观。
External Libraries只给我们提供了一个依赖结果,并没有指出是哪个依赖依赖了什么东西。
所幸,Gradle提供了一个task:androidDependencies,这个task能在命令行中显示依赖树之间的依赖关系。
找到androidDependencies task,每一个module下面都有相应的androidDependencies。
双击执行后就能在命令行中打印相关的依赖信息了,这里为了演示,我新建了一个项目。
如上图,可以看到不同的buildType的所有信息都打印出来了,比如release:
release
releaseCompileClasspath - Dependencies for compilation
+--- com.android.support:appcompat-v7:26.1.0@aar
+--- com.android.support.constraint:constraint-layout:1.1.2@aar
+--- com.android.support:animated-vector-drawable:26.1.0@aar
+--- com.android.support:support-vector-drawable:26.1.0@aar
+--- com.android.support:support-v4:26.1.0@aar
+--- com.android.support:support-media-compat:26.1.0@aar
+--- com.android.support:support-fragment:26.1.0@aar
+--- com.android.support:support-core-utils:26.1.0@aar
+--- com.android.support:support-core-ui:26.1.0@aar
+--- com.android.support:support-compat:26.1.0@aar
+--- com.android.support:support-annotations:26.1.0@jar
+--- com.android.support.constraint:constraint-layout-solver:1.1.2@jar
+--- android.arch.lifecycle:runtime:1.0.0@aar
+--- android.arch.lifecycle:common:1.0.0@jar
\--- android.arch.core:common:1.0.0@jar
复制代码
当然,这只是一个刚刚新增的项目,信息才这么少,如果是维护很久了的项目,那么信息将会让人眼花。
我们可以改为用命令行的方式打印信息,还可以进行相关的配置,配置的方法为:-q --configuration 依赖类型,如下就是打印implementation类型的依赖
./gradlew app:dependencies -q --configuration implementation
复制代码
可以看到,结果明显精简了很多
但是,我们仍然看不出什么东西是吧?所以,请看下一步
2.3. 引入插件
前面说了,作为一个开发者,怎么能做那么多繁琐的事情呢?所以这里有个插(wu)件(qi)。
可以直接通过面板的形式看到是哪个依赖库,具体是冲突了哪个版本。
该插件的适应方式比较简单,就不多讲了。
3. 如何解决冲突
3.1. jar包冲突
这是最简单的,删除其中一个jar包。
3.2. 在明确的知道是哪个库的哪些依赖的情况下
可以使用exclude来去除传递依赖,如下:
3.2.1 exclude group
根据包名来过滤,下面的配置是:过滤包名"com.android.support"的所有依赖
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support'})
复制代码
3.2.2 exclude module
根据模块名称来过滤下面的配置是过滤"support-annotations"这个模块
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude module: 'support-annotations'})
复制代码
3.3. 不知道是哪个库的传递依赖导致冲突
这种情况最常见,我不想去找,也不想去逐个排除,那么就有以下两种方案:
3.3.1 一劳永逸法
直接统一指定transitive,就是为给dependencies配置transitive为false,这样就会以你当前依赖的版本为准。但是最好不要使用这种方式。
...
configurations.all {transitive = false
}
...
dependencies{
}
复制代码
需要注意的是configurations和android、dependencies节点是处于同一级的。
3.3.2 逐个指定
哪个冲突指定哪个。具体可以查看我另外一篇文章Gradle之强制依赖某个第三方库
configurations.all {resolutionStrategy.force "com.android.support:appcompat-v7:22.2.1"
}
复制代码
最后
未完待续、敬请期待! 免为其难的关注一下公众号吧!!
转载于:https://juejin.im/post/5b8145bef265da4355387edc
Gradle 使用技巧(四) - 如何定位和解决依赖冲突相关推荐
- 排除jar_通过IDEA快速定位和排除依赖冲突
作者:jajianhttp://cnblogs.com/jajian/p/11002521.html 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计 ...
- IntelliJ IDEA-Maven解决依赖冲突大全
什么是依赖冲突 我们创建了一个项目,项目中使用到了两个jar包,一个是A,一个是B,但是A和B ,jar包同时依赖C jar包,但是A依赖C的1.0版本,B依赖的是C的2.0版本,那么maven会将所 ...
- Java学习笔记之二:Maven中依赖使用exclusions设置,来解决依赖冲突
一.依赖冲突产生的原因 调用的某个A包依赖于B包,B又依赖于C 和D 但是C依赖于E的1.0版本,D依赖于E的2.0版本 1.0跟2.0冲突了. 常见解决办法:直接使用2.0版本,删除1.0的依赖 ...
- IntelliJ IDEA 2022.1 正式发布!新增依赖分析器,轻松解决依赖冲突问题。。
点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 IntelliJ IDEA 2022.1 正式发布了,该版本的重点功能是:引入了 Dep ...
- ubuntu 安装自动解决依赖冲突
执行sudo apt-get install -f 转载于:https://www.cnblogs.com/bolddream/p/5681801.html
- Android解决依赖冲突
不好意思,我声明一下,我不是骗大家点击率,这个我是当做笔记来记录的,幸运的话,也能帮一些小伙伴解决问题.好东西一起分享.这位大神讲解的比较详细. https://blog.csdn.net/Calvi ...
- gradle项目 避免每次下载gradle文件/解决依赖下载慢的问题
参考:https://www.jb51.net/article/114276.htm 避免每次下载gradle文件 一.使用已存在的 gradle 版本 打开目录 ~/.gradle/wrapper/ ...
- Android Gradle依赖配置与依赖冲突解决
#.Gradle依赖配置 ##.Gradle依赖管理与两个重要的classpath相关,每个Module都有: 1.编译时路径:compileClasspath 编译时能使用的代码,当一个类参与编译时 ...
- Android三方依赖冲突及Gradle的exclude使用
一.场景 Android项目的开发过程中,我们项目中的gradle的dependencies闭包中会引入很多三方依赖库,引入的库越多,越容易产生库之间的依赖冲突.列举冲突的场景: 1.同一个依赖库引入 ...
最新文章
- 用Leangoo看板工具策划一场活动,看板示例
- Spring事务的处理流程、传播属性、及部分释疑
- 南溪的远程桌面软件使用笔记
- 渗透测试专题二之msf(kali)的攻击教程将DOS操作系统中的本地文件接口“中断13”改造为网络文件系统...
- java 获取文章关键词_在文章中获取关键字
- android 选择多选图片
- 返回通知异常通知环绕通知
- gdb官方说明文档中文版
- fastreport按条件查询_查询代价的
- 从零开始 DIY 智能家居 - 基于 ESP32 的智能语音合成播报模块
- 为什么「计件工资」的管理需要数字化?这家企业用实践解答
- 倒计时器 (WPF)
- 利用HomeKit、智汀家庭云,让不同生态智能家居实现互联互通
- lambda在python中的意思_Python中lambda x:x0 是什么意思?
- 这款小程序 能让你和孙悟空一样 可以七十二变
- AHP层次分析法求解过程(matlab代码)
- cocos2d-x位图字体生成工具Bitmap Font Generator的使用(内含命令行)
- 计算机等级一级考试excel多少分,计算机等级一级考试Excel技巧
- 怀念 KOF97,分享背景音乐
- 【转】通过JAVA获取优酷、土豆、酷6、6间房等视频