Android java util zip ZipeException:重复条目

Android java util zip ZipeException:重复条目,android,android-studio,gradle,error-handling,exception-handling,Android,Android Studio,Gradle,Error Handling,Exception Handling,在运行项目时,我遇到了这个错误 错误:任务“:……”的执行失败。 com.android.build.api.transform.TransformException:java.util.zip.zipeException:重复条目:javax/annotation/CheckForNull.class 这就是我的app:gradle的样子: apply plugin: 'com.android.application' android { compileSdkVersion 24 build

在运行项目时,我遇到了这个错误

错误:任务“:……”的执行失败。 com.android.build.api.transform.TransformException:java.util.zip.zipeException:重复条目: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'
}
截击:格拉德尔

android {
compileSdkVersion 17
buildToolsVersion "24.0.3"

defaultConfig {
    minSdkVersion 8
    targetSdkVersion 8
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}
图书馆:格拉德尔

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'
}
有人能提出一个解决这个错误的方法吗?
提前感谢。

您不需要在每个单独的模块中编译相同的依赖项,因为您的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.+'而是使用适当的版本

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

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

com.android.support:support-v4:_____
此库被多次使用。这就是你能做的。在库的gradle或facebooklib的gradle上执行此操作:

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

提示:在构建时,您应该做一个渐变任务来打印依赖项,并查看它。看看是否有什么可以删除/改进的地方

编辑:

在Android Studio的终端选项卡中运行此命令

./gradlew app:dependencies
这将打印出所有依赖项及其子依赖项。仔细查看,看看哪个依赖项在哪里被调用了两次

每次看到同一个库两次,都必须使用上面显示的排除方法排除该moude或group

请参阅此处了解更多详细信息。这是一个简单的解释

此库被多次使用。这就是你能做的。在库的gradle或facebooklib的gradle上执行此操作:

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

提示:在构建时,您应该做一个渐变任务来打印依赖项,并查看它。看看是否有什么可以删除/改进的地方

编辑:

在Android Studio的终端选项卡中运行此命令

./gradlew app:dependencies
这将打印出所有依赖项及其子依赖项。仔细查看,看看哪个依赖项在哪里被调用了两次

每次看到同一个库两次,都必须使用上面显示的排除方法排除该moude或group


请参阅此处了解更多详细信息。这是一个简单的解释

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

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

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

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

您可以在Android Studio中进行依赖项清理。执行此操作时,您将在树状图中找到每个模块的引用库。这样,您将发现哪些依赖项正在生成重复条目错误。 在项目中搜索哪些文件正在使用o引用CheckForNull.class。请注意包含它的包

在项目中打开“终端”窗口并执行以下命令

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生成的一个重复条目,引用了commons io依赖项

最后,在gradle文件中做如下排除:记住,在我的例子中,它是一个不同的依赖项:

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

您可以在Android Studio中进行依赖项清理。执行此操作时,您将在树状图中找到每个模块的引用库。这样,您将发现哪些依赖项正在生成重复条目错误。 在项目中搜索哪些文件正在使用o引用CheckForNull.class。请注意包含它的包

在项目中打开“终端”窗口并执行以下命令

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生成的重复条目,参考 公共io依赖

最后,在gradle文件中做如下排除:记住,在我的例子中,它是一个不同的依赖项:

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

Android Studio中的Build->Rebuild Project为我修复了它。

Android Studio中的Build->Rebuild Project为我修复了它。

在gradle sync>无法为项目上的参数[{module=support-v4}]找到排除方法时出错:org.gradle.api.Project类型的“库”。@Shahal查看我的编辑。这是一个项目,所以你需要一组额外的括号。我忘了:\得到同样的异常。但是exclude没有出现任何错误。您的主项目中也有相同的库,因此将其从facebookLiband library两个项目中排除。您有一个很长的依赖项列表,它是一个非常常见的库。我肯定有其他库或项目正在使用它向我的两个项目添加排除代码,但仍然得到相同的异常。ps:我已编辑了上述代码。gradle sync>在项目“:library”类型为org.gradle.api.project”的项目上找不到参数[{module=support-v4}]的方法exclude时出错。@Shahal查看我的编辑。这是一个项目,所以你需要一组额外的括号。我忘了:\得到同样的异常。但是exclude没有出现任何错误。您的主项目中也有相同的库,因此将其从facebookLiband library两个项目中排除。您有一个很长的依赖项列表,它是一个非常常见的库。我肯定有其他库或项目正在使用它向我的两个项目添加排除代码,但仍然得到相同的异常。ps:我已经编辑了上面的代码。我无法首先运行项目来完成所有这些操作。是的,您可以,在将我的代码片段添加到您的构建后运行gradle findDuplicates。gradleI get Error:28,1任务执行失败:findDuplicates'。>无法获得配置容器的未知属性“运行时”。更改为配置。编译。XI不能首先运行该项目来完成所有这些操作。是的,您可以,在添加我的代码段到您的Bug之后运行GADDLE DopDebug。Gracle获得错误:任务执行失败28, 1次:FixDeopix`>。无法获取配置容器的未知属性“runtime”。已更改为configurations.compile.x