2014-09-05 105 views
9

重複類錯誤當編譯我的應用程序,我得到以下錯誤(路徑的敏感件編輯了)安卓:在proguard的

Execution failed for task ':app:proguardDebug'. 
> java.io.IOException: Can't write [/projects/app/build/intermediates/classes-proguard/debug/classes.jar] (Can't read [/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/4216af16d38465bbab0f3dff8efa14204f7a399a/commons-codec-1.4.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [commons-codec-1.4.jar:org/apache/commons/codec/binary/Base64.class])) 

這表明,我認爲編譯器看到兩個地方的應用程序試圖使用commons.codec.binary.Base64.class作爲依賴項。我再次檢查並檢查了我的庫,但只有一個庫(Amazon AWS)正在嘗試使用它。

高於這個錯誤,我得到一些其他的警告,這也提高了紅旗我:

Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [commons-lang3-3.1.jar:META-INF/LICENSE.txt]) 
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [commons-lang3-3.1.jar:META-INF/NOTICE.txt]) 
Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [commons-codec-1.4.jar:META-INF/LICENSE.txt]) 
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [commons-codec-1.4.jar:META-INF/NOTICE.txt]) 

我沒有明確使用commons-編解碼器1.4或公地lang3-3.1在我應用程序,以爲我以前使用lang3之前刪除它。爲什麼這些在編譯日誌中被引用?我的一個Maven庫可以使用它們嗎?我將在我的gradle文件中包含下面的maven庫列表。

這裏是我的ProGuard和gradle這個文件,以供參考:

ProGuard的

-keep class org.w3c.dom.bootstrap.** { *; } 
-keep class org.joda.time.** { *; } 
-keep class com.facebook.** { *; } 
-keep class org.apache.commons.** { *; } 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 
-dontwarn org.codehaus.jackson.map.ext.** 
-dontwarn oauth.** 
-dontwarn com.amazonaws.** 
-dontwarn org.joda.time.** 
-dontwarn org.apache.commons.codec.** 
-dontwarn com.fasterxml.jackson.databind.ext.** 

搖籃

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 20 
    buildToolsVersion '20.0.0' 

    defaultConfig { 
     applicationId 'com.my.package' 
     minSdkVersion 14 
     targetSdkVersion 20 
     versionCode 9 
     versionName '1.2' 
    } 

    buildTypes { 
     release { 
      debuggable false 
      runProguard true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
     debug { 
      debuggable true 
      runProguard true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 

    lintOptions { 
     checkReleaseBuilds false 
    } 

    packagingOptions { 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/MANIFEST.MF' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 

    //noinspection GradleDependency 
    compile 'com.google.android.gms:play-services:5.0.89' 

    compile 'com.nineoldandroids:library:2.4.0' 
    compile 'com.viewpagerindicator:library:[email protected]' 
    compile 'se.emilsjolander:StickyScrollViewItems:1.1.0' 
    compile 'se.emilsjolander:stickylistheaders:2.5.0' 
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.2' 
    compile project(':facebook') 
    compile 'com.tumblr:jumblr:0.0.10' 
    compile 'com.android.support:support-v4:20.0.0' 
} 

我最好的猜測是一個或多個這些庫的使用apache lang3和編解碼器作爲自己的依賴關係,這導致了衝突當我編譯應用程序。這個問題只發生在我將亞馬遜作爲必需的jar包含的時候,所以我知道這在某種程度上是罪魁禍首,但我不知道還有什麼與它衝突。

我讀了一些關於使用proguard的-injars,但根據他們的文檔,Android不需要你使用它。

任何意見將不勝感激,謝謝!

+0

如果您想了解更多關於導致這些傳遞依賴性的信息,您可以通過運行'gradlew dependencyInsight --dependency = commons-lang3'來問Gradle。 – 2014-09-05 04:40:32

+0

我有類似的問題。編譯過程可以完成沒有錯誤,但我得到那些META-INF相關的警告 – Guilherme 2014-09-09 13:22:18

+0

我只有在通用圖像加載器上有相同的錯誤。運氣好的話? – akousmata 2015-05-18 15:09:31

回答

0

此問題的原因是重複的jar文件。

在您的項目目錄,試圖發現和消除

/projects/app/build/intermediates/classes-proguard/debug/classes.jar](無法讀取[/。gradle產出/緩存/模塊-2 /文件-2.1 /公地編解碼器/公地編解碼器/ 1.4/4216af16d38465bbab0f3dff8efa14204f7a399a /公地編解碼器1.4.jar

這個jar文件,看看是否有什麼變化。另外,如果有公地lang3 -3.1.jar在同一個或更高的地方,嘗試擦除和重建以及。

希望它有幫助!

+0

問題是,當我嘗試類似這樣的事情時,在下一個gradle構建它被讀入目錄時。 – JMRboosties 2014-10-28 21:39:06

+0

humm ...我想那是因爲你要麼指定某個地方該項目需要罐子,或者 – Shawn 2014-10-29 02:30:08

2

我不確定這是否會對您有所幫助,但我在此發佈我的答案,以防其他人發現這種情況很有用。我的問題是我的依賴關係聲明中有2個引用。我用的是通用圖像裝載機庫和我的發言是這樣的:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile 'com.android.support:support-v4:22.1.1' 
    compile 'uk.co.chrisjenx:calligraphy:2.0.2' 
    /* UIL was the failing reference */ 
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' 
    compile 'com.google.android.gms:play-services:7.3.0' 
} 

的問題,這我才意識到(頭咂嘴片刻後)是,我已經通過libs文件夾中引用UIL(即它已經由compile fileTree(dir: 'libs', include: ['*.jar'])聲明編制。所以它通過libs編譯一次,並通過顯式調用編譯引用到UIL。我刪除了顯式調用,並清除了錯誤。也許你正在調用你的libs目錄中的某個東西,它也包含對違規庫的引用,然後當它試圖編譯AWS服務時,它已經有一個公共庫和版本。