Erro de entrada duplicada Gradle: META-INF / MANIFEST.MF (ou como excluir um arquivo do jar)

19

Eu clonei um repositório do github porque queria estudar o código, mas quando tentei construí-lo no Android Studio, tive alguns problemas. Após adicionar o repositório google maven (conforme solicitado pelo Android Studio) e atualizar a versão Gradle Plugin e a versão Grade (para 3.5.2 e 5.4.1, respectivamente), a compilação falha devido ao seguinte erro:

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

E isso, para ser mais específico:

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

Aqui está o meu arquivo build.gradle no nível do projeto:


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

        }
    }

Aqui está o meu arquivo build.gradle do módulo (antes de tentar qualquer coisa):


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

Aqui está o que eu tentei até agora:

  • Adicionando o seguinte à seção android do meu arquivo build.gradle do 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'
                }
            }
        }
  • Adicionando isso:

    sourceSets.main.res.filter.exclude 'META-INF/MANIFEST'
        sourceSets.main.res.filter.exclude 'META-INF/MANIFEST.MF'
  • Também isto:

    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'
        }
  • E isto:

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

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

Acho que tentei quase tudo nesta questão: como excluir certos arquivos das compilações graduais do Android Studio?

Nada funcionou.

Depois de procurar uma solução, acho que o problema é que tenho dependências duplicadas. Então, eu tentei o seguinte:


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

E isto:


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

Ainda obtenho o mesmo erro.

Alguém poderia me dizer o que estou fazendo de errado? Obrigado em antecipação. :)

Laila Campos
fonte
Eu tenho o mesmo problema aqui com meu aplicativo Roboyard no GitHub: stackoverflow.com/q/59130438/1069083 Talvez você encontre semelhanças lá
rubo77 29/01

Respostas:

22

Como Rajen Raiyarela disse, vá para Arquivo-> Estrutura do projeto-> Projeto-> Versão do plug-in Android Gradle e faça o downgrade de 3.5.2 para 3.5.1.

Laila Campos
fonte
8
Isso realmente não é uma solução. Estúdio Android está incomodando cada vez para atualizar ...
doctorram
Esta resposta é obsoleta, pois uma atualização para o gradle 3.5.3 parece ter corrigido o problema
rubo77
6

Defina as dependências do projeto para:

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

ou mais recente.

Nota: ao fazer isso, meu problema foi resolvido.

Syed Daniyal Ali
fonte
Meu problema com Gradle 3.5.2 foi resolvido no 3.5.3 também, mas estar ciente: I receber o aviso `Recursos substituídos Gradle foram usados nesta compilação, tornando-se incompatível com Gradle 6.0.`
rubo77
1

Esse problema está acontecendo devido a dependências duplicadas.
Verifique se há várias dependências no aplicativo Gradle.

Srinivasan CP
fonte
Correto, esse é o problema. Haverá dependências duplicados em seus arquivos Gradle
Mariusb
11
@ Srinivasan, se houvesse duplicatas, ele deveria ter sido resolvido por excluir ou escolher a primeira opção em packagingOptions, mas é apenas com o plug-in Gradle. Ainda estou para verificar com mais precisão e criar um aplicativo de exemplo para regenerar o problema para adicionar uma solicitação no bugtracker para o android studio.
Rajen Raiyarela
0

Empacote ou não uma vez:

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