java util zip ZipException:重复条目

时间:2016-10-10 12:07:09

标签: android android-studio gradle error-handling exception-handling

在运行项目时,我收到此错误

  

错误:任务执行失败':..........'。   com.android.build.api.transform.TransformException:java.util.zip.ZipException:重复条目:javax / annotation / CheckForNull.class

这就是我的app: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'
    }
}
}

library: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'
}

有人可以建议摆脱这个错误吗? 提前谢谢。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

运行以下命令以查找重复项

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)"
            }
         }
      }
   }
}

答案 2 :(得分:1)

您可以在Android Studio中执行依赖项清理。执行此操作时,您将在树视图中找到每个模块的引用库。通过这种方式,您将找到生成重复条目错误的依赖项。 在项目中搜索哪些文件正在使用引用CheckForNull.class。记下包含它的包裹。

打开项目中的终端窗口,然后执行以下命令

success: function (data) {
            var arr = eval("(" + data.d + ")");
            alert(arr.jsonObject.message + "," + arr.jsonObject.error);
            var fatharName = arr.jsonObject.data.fathername;
            alert(fatharName);

请注意,将删除并重新下载所有依赖项。如果你有很多gradle库,可能需要几分钟才能再次下载。之后,您将找到一个摘要,您可以在其中过滤您所包装的包裹。在我的情况下问题是apache.commons包。我做过滤器并找到这样的东西:

gradlew clean app:dependencies

在我的情况下,它是由AWS Android SDK生成的重复条目,引用了commons-io依赖项。

最后,只需在您的gradle文件中进行排除(请记住,在我的情况下,这是一个diffenrt依赖项):

+--- 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

答案 3 :(得分:0)

您不需要在每个单独的模块中编译相同的依赖项,因为您的app:gradle正在编译  'com.android.support:support-v4:24.2.1' 已经在你的库gradle中编译为'com.android.support:support-v4:18.+'我可以看到你已经添加了库模块作为app:gradle的依赖项,在这里你试图复制它。其他模块也是如此。 除非他们是独立的。

提示:也不要使用'com.android.support:support-v4:18.+'之类的匿名版本,而是使用适当的版本。

答案 4 :(得分:0)

构建 - > Android Studio中的重建项目为我修复了它。