【问题标题】:Gradle duplicate entry error: META-INF/MANIFEST.MF (Or how to delete a file from jar)Gradle 重复输入错误:META-INF/MANIFEST.MF(或如何从 jar 中删除文件)
【发布时间】:2020-03-06 07:24:40
【问题描述】:

我克隆了一个 github 存储库,因为我想研究代码,但是当我尝试在 Android Studio 中构建它时,我遇到了一些麻烦。 添加 google maven 存储库(由 Android Studio 提示)并更新 Gradle 插件版本和等级版本(分别为 3.5.2 和 5.4.1)后,由于以下错误,构建失败:

原因:重复条目:META-INF/MANIFEST.MF

还有这个,更具体地说:

原因:java.util.zip.ZipException:重复条目:META-INF/MANIFEST.MF

这是我的项目级 build.gradle 文件:


    buildscript {
        repositories {
            jcenter()
            google()
        }
    
        dependencies {
            classpath 'com.android.tools.build:gradle:3.5.2'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            jcenter()
    
            maven {
                url 'https://maven.google.com'
            }
    
        }
    }

这是我的模块 build.gradle 文件(在尝试任何操作之前):


    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 22
        buildToolsVersion '28.0.3'
    
        defaultConfig {
            applicationId "com.thelittlenaruto.supportdesignexample"
            minSdkVersion 11
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation ('com.android.support:appcompat-v7:22.2.1')
        implementation ('com.android.support:design:22.2.1')
        implementation 'com.github.frankiesardo:linearlistview:1.0.1@aar'
    }

这是我迄今为止尝试过的:

  • 将以下内容添加到我的模块 build.gradle 文件的 android 部分:

    sourceSets {
            main{
                java{
                    exclude '**/META-INF/MANIFEST'
                    exclude '**/META-INF/MANIFEST.MF'
                    exclude 'META-INF/MANIFEST'
                    exclude 'META-INF/MANIFEST.MF'
                    exclude '!META-INF/MANIFEST.MF'
                }
            }
        }

  • 添加此内容:

    sourceSets.main.res.filter.exclude 'META-INF/MANIFEST'
        sourceSets.main.res.filter.exclude 'META-INF/MANIFEST.MF'

  • 还有这个:

    packagingOptions {
            apply plugin: 'project-report'
            exclude '**/META-INF/MANIFEST'
            exclude '**/META-INF/MANIFEST.MF'
            exclude 'META-INF/MANIFEST'
            exclude 'META-INF/MANIFEST.MF'
            exclude '!META-INF/MANIFEST.MF'
        }

  • 还有这个:

    packagingOptions {
            pickFirst '**/META-INF/MANIFEST'
            pickFirst '**/META-INF/MANIFEST.MF'
            pickFirst 'META-INF/MANIFEST'
            pickFirst 'META-INF/MANIFEST.MF'
            pickFirst '!META-INF/MANIFEST.MF'
        }

  • 这个:

    aaptOptions {
            ignoreAssetsPattern "!META-INF/MANIFEST.MF"
            ignoreAssetsPattern "META-INF/MANIFEST.MF"
        }

我想我已经尝试了这个问题的大部分内容: How to exclude certain files from Android Studio gradle builds?

没有任何效果。

在寻找解决方案后,我认为问题在于我有重复的依赖项。所以我尝试了以下方法:


    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation ('com.android.support:appcompat-v7:22.2.1'){
            exclude module: 'support-v4'
        }
        implementation ('com.android.support:design:22.2.1')
        implementation 'com.github.frankiesardo:linearlistview:1.0.1@aar'
    }

还有这个:


    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation ('com.android.support:design:22.2.1'){
            exclude module: 'support-v7'
        }
        implementation 'com.github.frankiesardo:linearlistview:1.0.1@aar'
    }

我仍然遇到同样的错误。

我做错了什么?

【问题讨论】:

标签: android android-studio gradle build.gradle


【解决方案1】:

正如Rajen Raiyarela 所说,转到文件->项目结构->项目->Android Gradle 插件版本并将其从 3.5.2 降级为 3.5.1。

【讨论】:

  • 这真的不是一个解决方案。 Android Studio 每次升级都在唠叨...
  • 这个答案已经过时了,因为升级到 gradle 3.5.3 似乎已经解决了这个问题
【解决方案2】:

项目依赖项设置为:

classpath 'com.android.tools.build:gradle:3.5.3'

或最新的。

注意:通过这样做,我的问题已经解决了。

【讨论】:

  • 我的 gradle 3.5.2 问题也已在 3.5.3 中解决,但请注意:我收到警告 `此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 6.0 不兼容。`
【解决方案3】:

由于重复的依赖关系而发生此问题。
检查 Gradle 应用中的多个依赖项。

【讨论】:

  • 正确,这就是问题所在。你的 gradle 文件中会有重复的依赖项
  • @Srinivasan,如果有重复,那么它应该通过在 PackagingOptions 中的 exclude 或 pickfirst 解决,但它仅与 Gradle 插件有关。我还没有做更精确的验证并创建一个示例应用程序来重新生成在 bugtracker for android studio 中添加请求的问题。
【解决方案4】:

要么打包一次,要么不打包:

android {
    packagingOptions {
        pickFirst "META-INF/MANIFEST.MF"
        // exclude "META-INF/MANIFEST.MF"
    }
}

【讨论】:

    【解决方案5】:

    正如@rubo77 所说,在我确认后:

    • 最新解决方案
      • 升级gradle版本
        • 例如:
          • 3.5.23.5.3
          • 3.5.23.5.4
    • 过时解决方案:
      • 3.5.2降级到3.5.1

    我的选择是:从3.5.2升级到3.5.4

    build.gradle:

        dependencies {
    //        classpath 'com.android.tools.build:gradle:3.5.2'
    //        classpath 'com.android.tools.build:gradle:3.5.3'
            classpath 'com.android.tools.build:gradle:3.5.4'
        }
    

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      相关资源
      最近更新 更多