0

在運行的項目中,我得到這個錯誤的Java UTIL拋出:ZipException郵編:重複條目

Error:Execution failed for task ':..........'. com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: javax/annotation/CheckForNull.class

這是怎麼了我的應用程序:gradle這個樣子:

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 24 
buildToolsVersion "24.0.3" 
useLibrary 'org.apache.http.legacy' 

defaultConfig { 
    applicationId "com.sample.Example" 
    minSdkVersion 15 
    targetSdkVersion 24 
    multiDexEnabled true 
} 

buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 
} 
} 

dependencies { 
compile (project(':library')){ 
    exclude module: 'support-v4' 
} 
compile (project(':facebookLib')){ 
    exclude module: 'support-v4' 
} 
compile 'com.google.http-client:google-http-client-gson:1.20.0' 
compile 'com.google.code.gson:gson:2.4' 
compile files('libs/CWAC-SackOfViewsAdapter.jar') 
compile files('libs/FlurryAgent.jar') 
compile files('libs/google-api-client-1.15.0-rc.jar') 
compile files('libs/google-api-client-android-1.15.0-rc.jar') 
compile files('libs/google-api-services-androidpublisher-v1-rev15-1.15.0-rc.jar') 
compile files('libs/google-http-client-1.15.0-rc.jar') 
compile files('libs/google-http-client-android-1.15.0-rc.jar') 
compile files('libs/google-http-client-jackson-1.15.0-rc.jar') 
compile files('libs/google-http-client-jackson2-1.15.0-rc.jar') 
compile files('libs/google-oauth-client-1.15.0-rc.jar') 
compile files('libs/google-oauth-client-java6-1.15.0-rc.jar') 
compile files('libs/httpmime-4.2.jar') 
compile files('libs/in-app-purchasing-1.0.3.jar') 
compile files('libs/jackson-core-2.1.3.jar') 
compile files('libs/jackson-core-asl-1.9.11.jar') 
compile files('libs/json_simple-1.1.jar') 
compile files('libs/jsr305-1.3.9.jar') 
compile files('libs/picasso-2.1.1.jar') 
compile files('libs/signpost-commonshttp4-1.2.1.1.jar') 
compile files('libs/signpost-core-1.2.1.1.jar') 
compile files('libs/signpost-jetty6-1.2.1.1.jar') 
compile files('libs/twitter4j-core-4.0.1.jar') 
compile files('libs/amazon-device-messaging-1.0.1.jar') 
compile 'com.google.android.gms:play-services:9.6.1' 
compile 'com.android.support:appcompat-v7:24.2.1' 
compile 'com.android.support:support-v4:24.2.1' 
compile 'com.android.support:design:24.2.1' 
compile 'com.android.support:recyclerview-v7:24.2.1' 
compile 'com.android.support:cardview-v7:24.2.1' 
compile 'com.android.support:multidex:1.0.1' 
} 

凌空:gradle這個

android { 
compileSdkVersion 17 
buildToolsVersion "24.0.3" 

defaultConfig { 
    minSdkVersion 8 
    targetSdkVersion 8 
} 

buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 
} 
} 

庫:gradle

android { 
compileSdkVersion 16 
buildToolsVersion "23.0.3" 

defaultConfig { 
    minSdkVersion 4 
    targetSdkVersion 4 
} 

buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 
} 
} 

dependencies { 
compile 'com.android.support:support-v4:18.0.0' 
} 

facebookLib:gradle這個

android { 
compileSdkVersion 17 
buildToolsVersion "24.0.3" 

defaultConfig { 
    minSdkVersion 8 
    targetSdkVersion 8 
} 

buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 
} 
} 

dependencies { 
compile 'com.android.support:support-v4:18.0.0' 
} 

有人能提出一個出路這個錯誤的? 在此先感謝。

回答

3
com.android.support:support-v4:_____ 

這個庫被多次使用。所以這是你可以做的。做到這一點無論是在圖書館的gradle這個或facebooklib的gradle產出:

compile(project(':facebookLib')) { 
    exclude module: 'support-v4' 
} 

OR

compile(project(':library')) { 
    exclude module: 'support-v4' 
} 

提示:你應該做一個任務的Gradle構建時,打印您的依賴關係,並看看它。看看是否有什麼事情你可以刪除/改善

編輯:

運行此命令在你的Android Studio中的端子接頭。

./gradlew app:dependencies 

這將打印出所有的依賴和他們的(子)依賴關係。仔細看看它,看看哪個依賴關係被調用兩次。

每次看到相同的庫兩次時,必須使用上面顯示的exclude方法排除該模塊或組。

查看此處瞭解更多詳情。這是很好和簡單的解釋。 https://www.linkedin.com/pulse/how-find-dependencies-particular-dependency-gradle-hesamedin-kamalan-1

+0

得到一個錯誤,而gradle這個同步 >找不到方法排除( )用於參數[{module = support-v4}]對項目':library'的org.gradle.api.Project類型。 – Shahal

+0

@Shahal看看我的編輯。這是項目,所以你需要一組額外的括號。我忘了:\ –

+0

得到相同的異常。但排除()沒有通過任何錯誤。 – Shahal

0

你不需要編譯同樣依賴每個單獨的模塊中,爲您的應用程序:gradle這個正在編制 'com.android.support:support-v4:24.2.1' 它已經在你的gradle庫編譯爲'com.android.support:support-v4:18.+「在那裏我可以看到您已經添加庫模塊一個依賴於應用程序:gradle,在這裏你試圖複製它。其他模塊也一樣。 除非他們是獨立的。

提示:同樣不要使用匿名版本,如'com.android.support:support-v4:18.+',而應使用適當的版本。

0

運行以下找到重複

task findDuplicates { 
    doLast { 
     String findMe = 'javax/annotation/CheckForNull.class' 
     configurations.compile.files.each { file -> 
     if (file.name.endsWith('.jar')) { 
      def classMatches = zipTree(file).matching { 
       include findMe 
      }.files 
      if (!classMatches.empty) { 
       println "Found $findMe in $file ${classMatches.size()} time(s)" 
      } 
     } 
     } 
    } 
} 
+0

我無法首先運行項目來完成所有這些工作。 – Shahal

+0

是的,你可以,在我的代碼段添加到你的'build.gradle'後運行'gradle findDuplicates' –

+1

我得到「錯誤:(28,1)任務執行失敗':findDuplicates' >無法獲取未知屬性'運行時'用於配置容器。「 – Giszmo

1

你可以在Android Studio中做的依賴清理。當你這樣做時,你會在樹形視圖中找到每個模塊的引用庫。通過這種方式,你會發現哪些依賴關係會產生重複的輸入錯誤。 在您的項目中搜索哪些文件正在使用引用CheckForNull.class。記下包含它的軟件包。

打開項目中的終端窗口,excecute後續命令

gradlew clean app:dependencies 

請注意,所有的依賴將被刪除並重新下載。如果您有很多Gradle庫,則可能需要幾分鐘才能再次下載。之後,您將找到一個摘要,您可以在其中篩選您找到的包裹。在我的情況下,問題是與apache.commons包。我做的過濾器,並找到這樣的事情:

+--- com.amazonaws:aws-android-sdk-s3:2.4.0 
| +--- com.amazonaws:aws-android-sdk-core:2.4.0 (*) 
| +--- com.amazonaws:aws-android-sdk-kms:2.4.0 
| | \--- com.amazonaws:aws-android-sdk-core:2.4.0 (*) 
| +--- org.apache.commons:commons-io:1.3.2 
| | \--- commons-io:commons-io:1.3.2 -> 2.4 
| +--- commons-io:commons-io:2.4 
| \--- org.bouncycastle:bcprov-jdk16:1.44 

在我的情況下,它是由AWS Android SDK中產生的重複條目,refered到公共-io的依賴。

最後,只要排除在這樣的gradle這個文件(請記住,在我的情況下,它是一個diffenrt依賴):

compile('com.amazonaws:aws-android-sdk-s3:2.4.0') 
     { 
      exclude group: 'org.apache.commons' 
     }