【问题标题】:java util zip ZipException: duplicate entryjava util zip ZipException:重复条目
【发布时间】:2017-02-18 20:30:20
【问题描述】:

运行项目时出现此错误

错误:任务 ':........' 执行失败。 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'
}

凌空:分级

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

有人可以提出解决此错误的方法吗? 提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案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)"
                  }
               }
            }
         }
      }
      

      【讨论】:

      • 我无法运行项目来完成所有这些工作。
      • 是的,您可以,在将我的 sn-p 添加到您的 build.gradle 后运行 gradle findDuplicates
      • 我收到“错误:(28, 1) 任务 ':findDuplicates' 执行失败。> 无法获取配置容器的未知属性 'runtime'。”
      • 更改为configurations.compile.x
      【解决方案3】:

      您可以在 Android Studio 中进行依赖项清理。执行此操作时,您将在树视图中找到每个模块的引用库。通过这种方式,您将发现哪些依赖项正在生成重复条目错误。 在您的项目中搜索哪些文件正在使用或引用 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'
              }
      

      【讨论】:

        【解决方案4】:
        com.android.support:support-v4:_____
        

        这个库被多次使用。所以这就是你可以做的。在您图书馆的 gradle 或 facebooklib 的 gradle 上执行此操作:

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

        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

        【讨论】:

        • 在 gradle 同步时出错 > 无法在 org.gradle.api.Project 类型的项目 ':library' 上找到参数 [{module=support-v4}] 的方法 exclude()。
        • @Shahal 看看我的编辑。这是项目,因此您需要一组额外的括号。我忘了:\
        • 得到同样的异常。但是 exclude() 没有出现任何错误。
        • 您的主项目中也有相同的库,因此将其从两个项目中排除,facebookLiblibrary。你有一个很长的依赖列表,它是一个很常见的库。我确定其他一些库或项目也在使用它
        • 向我的两个项目添加了排除代码,但仍然出现相同的异常。 ps:我已经编辑了我上面的代码。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2023-03-27
          • 2017-02-08
          • 1970-01-01
          • 2018-03-08
          • 2016-01-03
          • 1970-01-01
          • 1970-01-01
          • 2016-05-31
          • 2017-12-28
          相关资源
          最近更新 更多