Android Studio中如何解決重復依賴導致的app:transformClassesWithJarMergingForDebug
2016年10月11日 10:59:31
閱讀數:16103
當使用maven導入依賴時,可能會出現不同的依賴包含了同一個jar,在編譯期間不會報錯。可一旦run app的時候,就會報
Error:Execution?failed for?task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException:?java.util.zip.ZipException:?duplicate entry:?xxx.class
[if !supportLists]·?[endif]1
[if !supportLists]·?[endif]2
解決的方法是在引入依賴的時候把相同的jar去除掉。
比方說,我同時引入了bmob和retrofit2的依賴
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')
[if !supportLists]·?[endif]1
[if !supportLists]·?[endif]2
[if !supportLists]·?[endif]3
因為bmob底層也是通過引入okhttp來實現的,所以我報的錯是:
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
[if !supportLists]·?[endif]1
[if !supportLists]·?[endif]2
這時候我們可以發現
?com/google/gson/annotations/Expose.class
[if !supportLists]·?[endif]1
最后面有一個Expose.class?我們可以通過Search Everywhere去定位這個類(默認快捷鍵是雙擊shift)。
看,通過搜索的確發現了兩個一模一樣的類,而且來自不同的依賴,而重復的類庫正是gson。此時再回想起我剛剛是不是添加過一個
compile ('com.squareup.retrofit2:converter-gson:2.1.0')
[if !supportLists]·?[endif]1
好了,找到問題的根源的。那我們現在如何去除相同的類庫呢,很簡單:在AS中,選擇以project顯示項目,找到最下面的External Libraries,然后繼續找,找到相對應的類庫:
如圖依次點開之后發現了一個pom.xml,這里面就是關于這個jar的一些配置文件,點開之后長這個樣子
往下找,發現了一個gson的引用
沒錯,這個就是導致報錯的直接原因。復制里面groupId,到你的app的build.gradle里,找到那個依賴,添加{exclude group: 'com.google.code.gson'}?把這個groudId的引用去除掉。如下圖所示
好了,到此問題就解決了,如果你有多個重復依賴的話,就按照本文所給出的方法,一個一個去重。