Android(安卓)Studio/Gradle/重复依赖
碰到的问题
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/media/TransportController;
Error:Execution failed for task ‘:app:transformClassesWithJarMergingForDebug’.
com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: org/apache/http/entity/mime/content/ByteArrayBody.class
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lorg/apache/http/ConnectionClosedException;
探究
对这个问题的总结:
这个问题是重复依赖导致的。
造成的原因有多种,但是爆出这种错误的时候,DoubleShift 搜索错误中的最后一个单词都会发现在多个依赖中存在同一个包名的同名类。
解决方案1:
把多余的依赖删除掉
解决方案2:
如果你存在同一个项目既依赖moudle又依赖jar
是exclude语句只能在编译时将gradle文件里的依赖去除掉,而不能去掉libs文件里的jar包引用
group id->project视图,External Libraries,对应包下,pom.xml,groupId节点
如果你是不同的依赖中存在相同的 package.ClassName.class
那么可以通过Gradle语法解决。
compile('com.mxn.soul:flowingdrawer-core:1.2.0')compile('com.rengwuxian.materialedittext:library:2.1.4') { exclude group: 'com.nineoldandroids'}
flowingdrawer-core这个依赖里的libs文件夹下有nineoldandroids2.4.0.jar这个jar包。
materialedittext这个依赖里的gradle里compile ‘com.nineoldandroids.library:2.4.0’
所以会导致重复引用了jar包。在materialedittext的依赖里添加语句 exclude group: ‘com.nineoldandroids’,意思是编译的时候将group为com.nineoldandroids的所有library都去除在外,这样materialedittext就会自动去引用flowingdrawer-core项目里的nineoldandroids2.4.0.jar包了。
不过,我又进行了其他的尝试,我改成如下配置
compile('com.mxn.soul:flowingdrawer-core:1.2.0'){ exclude group: 'com.nineoldandroids'}compile('com.rengwuxian.materialedittext:library:2.1.4')
这样还是会出问题。想了想,应该是exclude语句只能在编译时将gradle文件里的依赖去除掉,而不能去掉libs文件里的jar包引用。
解决方案3
依赖的项目下载下来,作为module来引入到自己的项目里。
解决方案4
如果两个Jar中存在 packageName.className.class完全相同的情况’exclude’不好用。
我的本次做法是。把两个Jar下载下来,放到’/lib’中,然后对发生冲突的类,在一个jar包中直接把.class文件删除掉。
这么做不太合理:如果jar包中我所删除的内容有被引用,那这种方式很可能导致 classNotFound 错误巧合的是我这次操作没有碰到这个问题。
参考
- Android Studio的Gradle添加重复依赖的问题
- AndroidStudio下的依赖管理
更多相关文章
- Android(安卓)Base64Encoder解决方案
- [置顶] android 内存泄露那些事情之Handler(一)
- Android文件合并时,打包出错
- WeakReference 在android中的应用
- Android(安卓)InputMethodManager 导致的内存泄露及解决方案
- Android关于OnTouch 和OnClick同时调用冲突的解决方案
- android aidl接口初步了解
- [Android]android studio预览视图时报错
- Android(安卓)Studio中Gradle编译配置