Fehler bei der doppelten Eingabe von Gradle: META-INF / MANIFEST.MF (oder wie man eine Datei aus dem JAR löscht)

19

Ich habe ein Github-Repository geklont, weil ich den Code studieren wollte, aber als ich versuchte, ihn in Android Studio zu erstellen, hatte ich einige Probleme. Nach dem Hinzufügen des Google Maven-Repositorys (gemäß Aufforderung von Android Studio) und dem Aktualisieren der Gradle Plugin-Version und der Grade-Version (auf 3.5.2 bzw. 5.4.1) schlägt der Build aufgrund des folgenden Fehlers fehl:

Ursache: doppelter Eintrag: META-INF / MANIFEST.MF

Und das, um genauer zu sein:

Auslöser: java.util.zip.ZipException: doppelter Eintrag: META-INF / MANIFEST.MF

Hier ist meine build.gradle-Datei auf Projektebene:


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

        }
    }

Hier ist meine Datei build.gradle (bevor Sie etwas ausprobieren):


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

Folgendes habe ich bisher versucht:

  • Hinzufügen des folgenden zum Android-Abschnitt meines Moduls build.gradle-Datei:

    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'
                }
            }
        }
  • Hinzufügen dieses:

    sourceSets.main.res.filter.exclude 'META-INF/MANIFEST'
        sourceSets.main.res.filter.exclude 'META-INF/MANIFEST.MF'
  • Auch das:

    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'
        }
  • Und das:

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

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

Ich glaube, ich habe in dieser Frage fast alles versucht: Wie kann ich bestimmte Dateien von Android Studio Gradle Builds ausschließen?

Nichts hat geklappt.

Nach der Suche nach einer Lösung denke ich, dass das Problem darin besteht, dass ich Abhängigkeiten dupliziert habe. Also habe ich folgendes versucht:


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

Und das:


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

Ich bekomme immer noch den gleichen Fehler.

Könnte mir bitte jemand sagen, was ich falsch mache? Vielen Dank im Voraus. :) :)

Laila Campos
quelle
Ich habe hier das gleiche Problem mit meiner App Roboyard auf GitHub: stackoverflow.com/q/59130438/1069083 Vielleicht finden Sie dort Ähnlichkeiten
rubo77

Antworten:

22

Wie Rajen Raiyarela sagte, gehen Sie zu Datei-> Projektstruktur-> Projekt-> Android Gradle Plugin Version und stufen Sie es von 3.5.2 auf 3.5.1 herunter.

Laila Campos
quelle
8
Das ist wirklich keine Lösung. Android Studio
nagt
Diese Antwort ist veraltet, da ein Upgrade auf Gradle 3.5.3 das Problem
behoben
6

Setzen Sie die Projektabhängigkeiten auf:

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

oder neueste.

Hinweis: Auf diese Weise wurde mein Problem behoben.

Syed Daniyal Ali
quelle
Mein Problem mit Gradle 3.5.2 wurde auch in 3.5.3 behoben, aber beachten Sie: Ich erhalte die Warnung "In diesem Build wurden veraltete Gradle-Funktionen verwendet, sodass es nicht mit Gradle 6.0 kompatibel ist"
rubo77
1

Dieses Problem tritt aufgrund doppelter Abhängigkeiten auf.
Suchen Sie in der Gradle-App nach mehreren Abhängigkeiten.

Srinivasan CP
quelle
Richtig, das ist das Problem. Es wird doppelte Abhängigkeiten in Ihren Gradle-Dateien geben
MariusB
1
@Srinivasan, wenn es Duplikate gab, sollte es entweder durch Ausschließen oder durch Auswählen in packageOptions behoben werden, aber es gibt nur Probleme mit dem Gradle-Plugin. Ich muss noch genauer überprüfen und eine Beispiel-App erstellen, um das Problem beim Hinzufügen einer Anfrage im Bugtracker für Android Studio zu beheben.
Rajen Raiyarela
0

Entweder einmal verpacken oder gar nicht:

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