Ошибка записи дубликата Gradle: META-INF / MANIFEST.MF (или как удалить файл из jar)

19

Я клонировал репозиторий github, потому что хотел изучить код, но когда я попытался собрать его в Android Studio, я столкнулся с некоторыми проблемами. После добавления репозитория Google Maven (по запросу Android Studio) и обновления версии Gradle Plugin и Grade Version (до 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'
    }

Вот что я пробовал до сих пор:

  • Добавление следующего в раздел Android моего модуля build.gradle файла:

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

Я думаю, что я пробовал в основном все в этом вопросе: Как исключить определенные файлы из сборок для Android Studio?

Ничего не получалось.

После поиска решения, я думаю, проблема в том, что у меня есть дублированные зависимости. Итак, я попробовал следующее:


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

Я все еще получаю ту же ошибку.

Может ли кто-нибудь сказать мне, что я делаю не так? Спасибо в ожидании. :)

Лайла Кампос
источник
У меня есть такая же проблема здесь с моим приложением Roboyard на GitHub: stackoverflow.com/q/59130438/1069083 Может быть, вы найдете там сходства
rubo77

Ответы:

22

Как сказал Rajen Raiyarela , перейдите в Файл-> Структура проекта-> Проект-> Версия плагина Android Gradle и понизьте его с 3.5.2 до 3.5.1.

Лайла Кампос
источник
8
Это действительно не решение. Android Studio каждый раз
требует
Этот ответ устарел, так как обновление до версии 3.5.3 вместо этого, похоже,
решило
6

Установите зависимости проекта :

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

или последний.

Примечание: благодаря этому моя проблема была решена.

Сайед Даниял Али
источник
Моя проблема с gradle 3.5.2 была решена и в 3.5.3, но учтите: я получаю предупреждение: «В этой сборке использовались устаревшие функции Gradle, что делает его несовместимым с Gradle 6.0»
rubo77
1

Эта проблема возникает из-за дублированных зависимостей.
Проверьте наличие нескольких зависимостей в приложении Gradle.

Сринивасан КП
источник
Правильно, это проблема. В ваших файлах
Gradle
1
@Srinivasan, если были дубликаты, то это должно было быть решено либо с помощью exclude, либо с помощью pickfirst в packageOptions, но это проблема только с плагином Gradle. Мне еще предстоит сделать более точную проверку и создать пример приложения, чтобы восстановить проблему для добавления запроса в bugtracker для Android Studio.
Раджен Райярела
0

Либо упакуйте его один раз, либо совсем не

android {
    packagingOptions {
        pickFirst "META-INF/MANIFEST.MF"
        // exclude "META-INF/MANIFEST.MF"
    }
}
Мартин Цайтлер
источник