Erreur d'entrée en double Gradle: META-INF / MANIFEST.MF (ou comment supprimer un fichier du pot)

19

J'ai cloné un référentiel github parce que je voulais étudier le code, mais quand j'ai essayé de le construire dans Android Studio, j'ai rencontré des problèmes. Après avoir ajouté le référentiel google maven (comme demandé par Android Studio) et mis à jour à la fois la version du plug-in Gradle et la version de la note (vers 3.5.2 et 5.4.1, respectivement), la construction échoue en raison de l'erreur suivante:

Cause: entrée en double: META-INF / MANIFEST.MF

Et ceci, pour être plus précis:

Provoqué par: java.util.zip.ZipException: entrée en double: META-INF / MANIFEST.MF

Voici mon fichier build.gradle au niveau du projet:


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

        }
    }

Voici mon fichier build.gradle du module (avant d'essayer quoi que ce soit):


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

Voici ce que j'ai essayé jusqu'à présent:

  • Ajout de ce qui suit à la section Android de mon fichier build.gradle du module:

    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'
                }
            }
        }
  • Ajout de ceci:

    sourceSets.main.res.filter.exclude 'META-INF/MANIFEST'
        sourceSets.main.res.filter.exclude 'META-INF/MANIFEST.MF'
  • Aussi ceci:

    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'
        }
  • Et ça:

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

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

Je pense que j'ai essayé presque tout dans cette question: comment exclure certains fichiers des versions de gradle d'Android Studio?

Rien n'a fonctionné.

Après avoir cherché une solution, je pense que le problème est que j'ai des dépendances dupliquées. J'ai donc essayé ce qui suit:


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

Et ça:


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

Je reçois toujours la même erreur.

Quelqu'un pourrait-il me dire ce que je fais mal? Merci d'avance. :)

Laila Campos
la source
J'ai le même problème ici avec mon application Roboyard sur GitHub: stackoverflow.com/q/59130438/1069083 Peut-être y trouvez-vous des similitudes
rubo77

Réponses:

22

Comme l'a dit Rajen Raiyarela , allez dans Fichier-> Structure du projet-> Projet-> Version du plug-in Android Gradle et rétrogradez-le de 3.5.2 à 3.5.1.

Laila Campos
la source
8
Ce n'est vraiment pas une solution. Android Studio harcèle à chaque fois pour mettre à niveau ...
doctorram
Cette réponse est obsolète, car une mise à niveau vers la version 3.5.3 semble avoir résolu le problème
rubo77
6

Définissez les dépendances du projet sur:

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

ou le dernier.

Remarque: ce faisant, mon problème a été résolu.

Syed Daniyal Ali
la source
Mon problème avec Gradle 3.5.2 a également été résolu dans 3.5.3, mais sachez que: je reçois l'avertissement `` Des fonctionnalités Gradle obsolètes ont été utilisées dans cette version, ce qui les rend incompatibles avec Gradle 6.0. ''
rubo77
1

Ce problème se produit en raison de dépendances en double.
Recherchez plusieurs dépendances dans l'application Gradle.

Srinivasan CP
la source
C'est ça, le problème. Il y aura des dépendances en double dans vos fichiers de
notes
1
@Srinivasan, s'il y avait des doublons, alors il aurait dû être résolu en excluant ou en sélectionnant first dans packagingOptions, mais il ne pose problème qu'avec le plugin Gradle. Je n'ai pas encore vérifié plus précisément et créé un exemple d'application pour régénérer le problème d'ajout d'une demande dans bugtracker pour android studio.
Rajen Raiyarela
0

Soit l'emballer une fois ou pas du tout:

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