在项目中尤其是大项目中,经常会引用很多第三发 jar,或者 lib,就难免出现 jar 包冲突的现象,一般冲突都会很详细的告诉你哪个类.比如
duplicate entry: xxx.class
解决的方法是在引入依赖的时候把相同的 jar 去除掉.
比方说,我同时引入了 bmob 和 retrofit2 的依赖
因为 bmob 底层也是通过引入 okhttp 来实现的,所以我报的错是:
compile ('cn.bmob.android:bmob-sdk:3.5.1')
compile ('com.squareup.retrofit2:retrofit:2.1.0')
compile ('com.squareup.retrofit2:converter-gson:2.1.0')
这时候我们可以发现
Error: Execution failed
for task ':app:transformClassesWithJarMergingForDebug'.com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com / google / gson / annotations / Expose.class
com/google/gson/annotations/Expose.class
最后面有一个 Expose.class
我们可以通过 Search Everywhere 去定位这个类(默认快捷键是双击 shift).
看,通过搜索的确发现了两个一模一样的类, 而且来自不同的依赖, 而重复的类库正是 gson.此时再回想起我刚刚是不是添加过一个
compile ('com.squareup.retrofit2:converter-gson:2.1.0')
好了,找到问题的根源的.那我们现在如何去除相同的类库呢,很简单:
在 AS 中,选择以 project 显示项目,找到最下面的 External Libraries,然后继续找,找到相对应的类库:
gson
如图依次点开之后发现了一个 pom.xml,这里面就是关于这个 jar 的一些配置文件,点开之后长这个样子
pom.xml
往下找,发现了一个 gson 的引用
gson 引用
没错,这个就是导致报错的直接原因.复制里面 groupId,到你的 app 的 build.gradle 里,找到那个依赖,添加 {exclude group:'com.google.code.gson'
把这个 groudId 的引用去除掉.如下图所示
去除重复依赖
好了,到此问题就解决了,如果你有多个重复依赖的话,就按照本文所给出的方法,一个一个去重.
来源: http://www.jianshu.com/p/28e64482696c