相信每个人都遇到过重复引用库、冲突的问题。如support-v4、appcompat-v7、NineOldAndroids很容易被多次引用。
前同事在临上线前打包遇到merg出错
How fix?
最近发现一个更快查看依赖问题方法
第一种快捷查看依赖问题命令
- gradle -q app:dependencies
第二种各module逐步查看
一个一个module检查过去没有,这时候就有可能是第三方库引用了,可是第三方库那么多,How do?头疼,先换个姿势找到哪两个jar导致重复。通过打开文件发现DisplayManagerCompat类属于哪两个jar包
可以确定出问题的jar为support-compat-25.1.0和support-v4-22.2.0,我们自己有依赖compat、v4 22.2.0,现在要找出冲突的compat25.1是哪个库添加的(前戏太长,我们要直奔主题)。使用maven时可以查看依赖关系,没理由要取代maven的gradle不支持。
- gradle projects
先查看有哪些项目
- gradle project:dependencies
其中project指上面projects获得的project,如IMKit gradle IMKit:dependencies
从图中可以看到是butterknife8.5.1依赖了compat25.1.0。
解决办法
添加exclude法
修改compile添加exclude后解决
1
2
3compile ("com.jakewharton:butterknife:8.5.1") {
exclude group : 'com.android.support'
}
Grovvy脚本修改版本号方法
在其存在冲突的module中的build.gradle文件中加入下面代码,原理就是通过遍历所有依赖,并修改指定库的版本号
其中
requested.group == ‘com.android.support’ com.android.support表示要修改的依赖库
details.useVersion ‘27.1.1’ 27.1.1表示要修改的版本号1
2
3
4
5
6
7
8
9
10configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '27.1.1'
}
}
}
}
扩展
强制指定低版本force
同一个grop的库多个引用时,会自动取最版本最高的,即我们通过gradle dependencies查看后的标(*)或者 -> 后的版本。
但是我们有时候需要覆盖使用为低版本,应用场景,使用React Native时想指定‘com.android.support:appcompat-v7:23.0.1’可以修改为1
2
3compile ("com.android.support:appcompat-v7:23.0.1") {
force = true
}查看pom依赖关系
可以通过gradle命令查看依赖关系,那么我们写在build.gradle里面的依赖关系一定也有地方指定。每个工程里面指定gradle,gradle查找依赖库。根据这个逻辑,查看项目文件夹下的.idea->libraries->butterknife_8_5_1.xml、support_compat_25_1_0.xml、support_v4_22_2_0.xml,其中butterknife_8_5_1.xml内容如下:1
2
3
4
5
6
7
8
9
10
11
12<component name="libraryTable">
<library name="butterknife-8.5.1">
<CLASSES>
<root url="file://$PROJECT_DIR$/regClientDoc/build/intermediates/exploded-aar/com.jakewharton/butterknife/8.5.1/res" />
<root url="jar://$PROJECT_DIR$/regClientDoc/build/intermediates/exploded-aar/com.jakewharton/butterknife/8.5.1/jars/classes.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jakewharton/butterknife/8.5.1/16724f486072e3ab970fc47ccff6f9013061fa6/butterknife-8.5.1-sources.jar!/" />
</SOURCES>
</library>
</component>
根据source文件上级目录进入,找到butterknife-8.5.1.pom文件,内容如下:
1 |
|
可以看到其中有依赖support-compat25.1.0