Error de entrada duplicada de Gradle: META-INF / MANIFEST.MF (o cómo eliminar un archivo de jar)

19

He clonado un repositorio de github porque quería estudiar el código, pero cuando intenté compilarlo en Android Studio, tuve algunos problemas. Después de agregar el repositorio de google maven (como lo solicitó Android Studio) y actualizar tanto la versión del complemento de Gradle como la versión de grado (a 3.5.2 y 5.4.1, respectivamente), la compilación falla debido al siguiente error:

Causa: entrada duplicada: META-INF / MANIFEST.MF

Y esto, para ser más específico:

Causado por: java.util.zip.ZipException: entrada duplicada: META-INF / MANIFEST.MF

Aquí está mi archivo build.gradle a nivel de proyecto:


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

        }
    }

Aquí está mi archivo build.gradle de módulo (antes de intentar cualquier cosa):


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

Esto es lo que he probado hasta ahora:

  • Agregar lo siguiente a la sección de Android del archivo build.gradle de mi módulo:

    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'
                }
            }
        }
  • Agregando esto:

    sourceSets.main.res.filter.exclude 'META-INF/MANIFEST'
        sourceSets.main.res.filter.exclude 'META-INF/MANIFEST.MF'
  • También esto:

    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'
        }
  • Y esto:

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

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

Creo que he intentado casi todo en esta pregunta: ¿Cómo excluir ciertos archivos de las compilaciones de gradle de Android Studio?

Nada funcionó.

Después de buscar una solución, creo que el problema es que tengo dependencias duplicadas. Así que probé lo siguiente:


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

Y esto:


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

Todavía recibo el mismo error.

¿Podría alguien decirme qué estoy haciendo mal? Gracias de antemano. :)

Laila Campos
fuente
Tengo el mismo problema aquí con mi aplicación Roboyard en GitHub: stackoverflow.com/q/59130438/1069083 Quizás encuentres similitudes allí
rubo77

Respuestas:

22

Como dijo Rajen Raiyarela , vaya a Archivo-> Estructura del proyecto-> Proyecto-> Versión del complemento de Android Gradle y descárguela de 3.5.2 a 3.5.1.

Laila Campos
fuente
8
Esto realmente no es una solución. Android Studio molesta cada vez que se actualiza ...
doctorram
Esta respuesta es obsoleta, ya que una actualización a gradle 3.5.3 parece haber solucionado el problema
rubo77
6

Establecer dependencias del proyecto para:

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

o el último.

Nota: al hacer esto, mi problema ha sido resuelto.

Syed Daniyal Ali
fuente
Mi problema con Gradle 3.5.2 también se resolvió en 3.5.3, pero tenga en cuenta: aparece la advertencia `Las características de Gradle en desuso se utilizaron en esta compilación, lo que lo hace incompatible con Gradle 6.0 '.
Rubo77
1

Este problema ocurre debido a dependencias duplicadas.
Verifique si hay varias dependencias en la aplicación Gradle.

CP Srinivasan
fuente
Correcto, este es el problema. Habrá dependencias duplicadas en sus archivos
gradle
1
@Srinivasan, si hubiera duplicados, entonces debería haberse resuelto excluyendo o seleccionando primero en packageOptions, pero solo se emite con el complemento Gradle. Todavía tengo que verificar con mayor precisión y crear una aplicación de muestra para regenerar el problema para agregar una solicitud en bugtracker para Android Studio.
Rajen Raiyarela
0

Ya sea empaquetarlo una vez o no hacerlo:

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