Es wurde mehr als eine Datei mit dem vom Betriebssystem unabhängigen Pfad 'META-INF / LICENSE' gefunden.

331

Wenn ich meine App erstelle, wird folgende Fehlermeldung angezeigt:

Fehler: Ausführung für Aufgabe ': app: transformResourcesWithMergeJavaResForDebug' fehlgeschlagen. Es wurde mehr als eine Datei mit dem vom Betriebssystem unabhängigen Pfad 'META-INF / LICENSE' gefunden.

Dies ist meine build.gradle-Datei:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "cn.sz.cyrus.kotlintest"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        javaCompileOptions{
            annotationProcessorOptions{
                includeCompileClasspath = true
            }
        }
        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
 /*       exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'*/
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
    compile 'com.github.GrenderG:Toasty:1.2.5'
    compile 'com.orhanobut:logger:1.15'

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.umeng.analytics:analytics:latest.integration'
    compile 'ai.api:libai:1.4.8'
    compile 'ai.api:sdk:2.0.5@aar'
// api.ai SDK dependencies
    compile 'com.google.code.gson:gson:2.8.0'
    compile 'commons-io:commons-io:2.4'
    compile 'com.android.support:multidex:1.0.1'
}

Wenn ich diesen Code zu meiner build.gradle-Datei hinzufüge,

  packagingOptions {
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
        }

Dieser Fehler wäre behoben, aber ein anderes Problem wird auftreten. So was:

java.lang.NoClassDefFoundError: com.squareup.leakcanary.internal.HeapAnalyzerService
at com.squareup.leakcanary.LeakCanary.isInAnalyzerProcess(LeakCanary.java:145)
at cn.sz.cyrus.wemz.TestApplication.onCreate(TestApplication.kt:32)

Wer hat Ideen, wie man das löst?

Cyrus
quelle
Beim Zugriff auf die Google API Client Library für Android trat das gleiche Problem auf. Das Problem wurde behoben, indem das Modul HttpClient von Gradle-Abhängigkeiten ausgeschlossen wurde. Weitere Informationen finden Sie in den Google-Dokumenten. Developers.google.com/api-client-library/java/… durchsuchen Sie die Dokumentenseite mit "Unter Android müssen Sie nicht verwendete Abhängigkeiten explizit ausschließen:"
mifthi

Antworten:

490

Sie können dies yourProject/app/build.gradleinnen hinzufügenandroid{}

android {      
      packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude("META-INF/*.kotlin_module") 
      }          
}
Shaaban Ebrahim
quelle
23
Können Sie bitte erklären, warum dies funktioniert und welche Bedeutung "META-INF" hat? Vielen Dank!
Shreshth Kharbanda
@CodeSlave es verursacht ein Problem mit apk, wenn wir diese Dateien nicht von google.github.io/android-gradle-dsl/current/… ausgeschlossen haben. Ausschlusspfade, die einem Ausschlussmuster entsprechen, werden nicht in die APK aufgenommen. das alles was ich weiß. Ich habe keine vollständige Vorstellung von diesem Problem
Shaaban Ebrahim
11
Während dies die Frage beantworten kann, ist es besser, eine Beschreibung hinzuzufügen, wie diese Antwort zur Lösung des Problems beitragen kann. Bitte lesen Sie Wie schreibe ich eine gute Antwort , um mehr zu erfahren ?
Roshana Pitigala
3
In meinem Fall musste ich auch 'META-INF / LICENSE.md' und 'META-INF / LICENSE-notice.md'
hinzufügen
1
Fügen Sie Ausschluss ("META-INF / *. Kotlin_module") in packaginOptions Liste
Jaspal
129

In meinem Fall war es ausreichend, nur den Pfad 'META-INF / DEPENDENCIES' im yourProject/app/build.gradleInneren auszuschließen android{} . Hier ist es

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
}

Führen Sie dann "Projekt bereinigen" und "Projekt neu erstellen" aus.

Mara
quelle
11
Versuchen Sie, 'META-INF / DEPENDENCIES' auszuschließen, statt 'META-INF / LICENSE'
auszuschließen
7
Erklärung bitte
Mohammad Ali
1
@SilSur schließen Sie diese Datei aus, so dass Sie irrtümlich wie in meinem Code den gleichen Fehler für "META-INF / proguard / androidx-annotations.pro" dieser Datei haben, und dann wurde ich ausschließen 'META-INF / proguard / androidx-annotations. pro 'und seine Arbeit.
Gunavant Patel
4
Während dies die Frage beantworten kann, ist es besser, eine Beschreibung hinzuzufügen, wie diese Antwort zur Lösung des Problems beitragen kann. Bitte lesen Sie Wie schreibe ich eine gute Antwort , um mehr zu erfahren ?
Roshana Pitigala
Sie müssen nicht nur Gradle-Dateien synchronisieren
Steve Moretz
75

Die Lösungen hier haben mir nicht geholfen, aber dieser Link getan.

Wenn Sie eine Bibliothek haben, die einige Android-So-Dateien hinzufügt - wie libassmidi.sooder libgnustl_shared.so-, müssen Sie gradle anweisen , beim Packen nur eine auszuwählen, da sonst der Konflikt auftritt .

android {
  packagingOptions {
    pickFirst 'lib/armeabi-v7a/libassmidi.so'
    pickFirst 'lib/x86/libassmidi.so'
  }
}

Ich hatte dieses Problem, als ich eine React Native-App als Bibliothek in einem Android-Projekt verwendete. Ich hoffe es hilft

Daniel Reina
quelle
2
Vielen Dank, ich hatte das gleiche Problem mit nur einer .so-Datei. Es gibt eine andere Datei namens gdbserver im selben Ordner und nach dem Hinzufügen der packageOptions für die Bibliothek funktioniert sie jetzt.
Mr. Fish
1
Vielen Dank!
Hat
31

Hatte eine ähnliche Nachricht

Fehler: Ausführung für Aufgabe ': app: transformResourcesWithMergeJavaResForDebug' fehlgeschlagen. Es wurde mehr als eine Datei mit dem vom Betriebssystem unabhängigen Pfad 'Konstante-Werte.html' gefunden.

Um das Problem zu beheben, musste ich die Paketansicht ( 1 ) in Android Studio aktivieren , dann in der Baumstruktur nach Bibliotheken suchen und die Duplikate suchen ( 2 ).

Dann Strg + Alt + F12 (oder RMB-Menü) ( 3 ) - und Bibliotheken gefunden, die das Problem verursacht haben. Liste der Dateien in den Bibliotheken erstellt, die die Probleme verursacht haben, und in die build.gradle-Datei der App im Android- Bereich geschrieben. Eine andere Möglichkeit besteht darin, sich mit der Bibliothek zu befassen, die doppelte Dateien enthält

packagingOptions {
    exclude 'allclasses-frame.html'
    exclude 'allclasses-noframe.html'
    <..>

Geben Sie hier die Bildbeschreibung ein

Dmitrii Chichuk
quelle
1
Wie können Sie "dann durch den Baum zu Bibliotheken navigieren und die Duplikate suchen"? Haben Sie wirklich alle Dateien in allen Ordnern durchgesehen?
Android-Entwickler
1
Ich bin auch verwirrt über "Finde die Duplikate". Es gibt vielleicht 100 Untereinträge in App / Bibliotheken ... wie geht man vor, um Duplikate zu finden?
Freewalker
28

Wenn gradle die apk-Datei zusammenstellt, kopiert es grundsätzlich Inhalte aus allen Kompilierungsabhängigkeiten. Es ist intelligent genug, um zu erkennen, dass es eine doppelte Datei gibt, die aus zwei verschiedenen JAR-Dateien stammt. Dies kann eine beliebige Datei wie a.txt oder META-INF / DEPENDENCIES sein. Es ist möglicherweise am besten, diese Dateien wie folgt auszuschließen, falls die Datei dort nur zu Informationszwecken vorhanden ist.

android{
    packagingOptions {
       exclude 'META-INF/DEPENDENCIES'
    }
}

Wenn es sich bei der Datei um eine obligatorische Datei wie eine Klassendatei handelt, die über zwei miteinander verbundene JAR-Abhängigkeiten dupliziert wurde, ist es am besten, Alternativen zu diesen Jars in Form einer kompatibleren Version zu finden.

ank
quelle
Wenn ich dies zu meinem Projekt hinzufüge, erhalte ich einen weiteren Fehler, den ich wieder nicht beheben kann! Irgendeine andere Lösung?
Hetsgandhi
Hetvi Gandhi, was ist der Fehler, den Sie sehen?
Ank
20

Ich hatte das gleiche Problem und habe es versucht

Fehler: Es wurde mehr als eine Datei mit dem betriebssystemunabhängigen Pfad 'META-INF / proguard / androidx-annotations.pro' gefunden.

Lösung: Alles, was Sie tun müssen, um dies zu beheben, ist, dies dem Android {} -Abschnitt im 'build.gradle' Ihrer App hinzuzufügen.

packagingOptions {
    exclude 'META-INF/proguard/androidx-annotations.pro'
}
Apoorva Jain
quelle
18

Dies geschieht bei der Verwendung

org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.2.0

Und ist in der nächsten Version behoben

org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.2.1

Vairavan
quelle
1
ähnliches Problem mit org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.3.6, das derzeit das neueste ist. musste herabstufen
farhan patel
Ja, das gleiche Problem am 1.3.6
Shefchenko
17

Ich habe den gleichen Fehler festgestellt und festgestellt, dass er aus verschiedenen Modulen resultiert, die dieselben Klassen aus verschiedenen Paketen enthalten .

zB Ein verwendetes Androidx-Paket und das andere verwendete Pre-Androidx

Ich habe es gelöst, indem ich das Pre-AndroidX-Modul mit der integrierten Funktion von Android Studio auf AndroidX migriert habe : "Refactor -> Migrate to Androidx ...", ohne etwas auszuschließen.


In Ihrer Situation können Sie überprüfen, ob Abhängigkeiten zwischen Modulen nicht übereinstimmen.

Owen Chen
quelle
1
Vergessen Sie nicht, eine Sicherungskopie der aktuellen Version Ihres Projekts zu erstellen, da die Migration auf AndroidX Ihr Projekt beschädigen kann!
Kathir
12

Ich habe alle Antworten zum Erhalt dieser Nachricht gelesen Android Studio:

Es wurde mehr als eine Datei mit dem vom Betriebssystem unabhängigen Pfad 'META-INF / LICENSE' gefunden.

aber in diesem Fall ist das Ausschließen von Klassen nicht erforderlich, wir müssen nur ausschließen 'META-INF/DEPENDENCIES', dies kann innerhalb von /app/build.gradle:

android{
    ...
    ...
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }

}
Jorgesys
quelle
Dasselbe wurde in Hunderten anderer Antworten auf SO
Atul
11

Ich habe Studio von Java 7 auf Java 8 aktualisiert und dieses Problem ist aufgetreten. Dann habe ich es so gelöst:

android {
    defaultConfig {
    }
    buildTypes {
    }
    packagingOptions{
        exclude 'META-INF/rxjava.properties'
    }
}
Manasvi
quelle
8

In meiner App habe ich die JAR-Abhängigkeiten wie folgt hinzugefügt:

implementation files('libs/json-simple-1.1.1.jar')

Ich stellte jedoch fest, dass sie aufgrund der folgenden ersten Zeile in Abhängigkeiten bereits hinzugefügt wurden:

implementation fileTree(include: ['*.jar'], dir: 'libs')

Diese Zeile fügt alle Jars im lib-Ordner zur App-Abhängigkeit hinzu.

Daher nach dem Entfernen der zusätzlichen Abhängigkeit implementation files('libs/json-simple-1.1.1.jar')

es funktioniert gut.

Sandeep Yohans
quelle
Dies ist hilfreich, hängt aber nicht mit der Antwort zusammen. In den Bibliotheken finden Sie Dateien Meta-Ordner META-INF, die in Name und Format ähnlich sein können. Diese verursachen Probleme mit doppelten Dateien und müssen daher entfernt werden.
Abhinav Saxena
7

Ich habe ein ähnliches Problem bei der Arbeit in einer App-Umgebung mit mehreren Modulen festgestellt:

Fehler: Ausführung für Aufgabe ': app: transformResourcesWithMergeJavaResForDebug' fehlgeschlagen. Es wurde mehr als eine Datei mit dem vom Betriebssystem unabhängigen Pfad 'META-INF / AL2.0' gefunden.

Dieses Problem wurde von mehreren meiner Module gemeldet, und keine der oben genannten Lösungen hat es behoben. Es stellte sich heraus, dass ich die Version Coroutines 1.3.6 verwendete, in die META-INF / AL2.0 eingebettet zu sein schien, die bereits von einer anderen der von mir verwendeten Bibliotheken eingebettet war. Um dies zu beheben, habe ich dem build.gradle des fehlerhaften Moduls das folgende Codefragment hinzugefügt:

configurations.all {
    resolutionStrategy {
        exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug"

    }
}

Da es auf mehreren Modulen passiert ist, habe ich das verschoben resolutionStrategy Code in mein build.gradle auf Projektebene verschoben. Danach hat alles geklappt.

Fred B.
quelle
4

Ich habe das gleiche Problem und habe es versucht

Error: mehr als eine Datei mit dem betriebssystemunabhängigen Pfad 'META-INF / library_release.kotlin_module' gefunden.

Lösung:

android {
    packagingOptions {
    exclude 'META-INF/library_release.kotlin_module'
    }
}
Bhavesh Moradiya
quelle
3

Ich hatte ein ähnliches Problem. Ich bekam die Fehlermeldung -

Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.

More than one file was found with OS independent path 'javax/annotation/WillCloseWhenClosed.java'

Wie in einigen der obigen Antworten angegeben, funktioniert die Verwendung des folgenden Codes

'packagingOptions {
       exclude 'allclasses-frame.html'
    }'

Aber ich habe diesen Fehler für 20 verschiedene Dateien erhalten, also habe ich nach dem Ausschließen von 20 Dateien angehalten und versucht, eine anständige Lösung zu finden. Ich war auch dem begegnet

'Unable to execute dex: Multiple dex files' error.

Ich habe es endlich geschafft, das zu lösen.

Erstens (wie in meinem Fall WillCloseWhenClosed.java war die doppelte Datei) haben Sie in Android Studio die Option "Überall suchen". Schreiben und suchen Sie dort nach der Datei. Dort habe ich mehrere Instanzen dieser Datei gefunden. Also klickte ich auf beide Instanzen und sah ihren Speicherort, indem ich mit der rechten Maustaste auf die Datei klickte und ihren Speicherort sah, als sie in Android Studio geöffnet wurden.

Zweitens habe ich herausgefunden, dass ich einige Abhängigkeiten in der Gradle-Datei hatte. Ich habe den folgenden Code verwendet

dependencies {
    compile 'com.google.api-client:google-api-client:1.23.0'
}

Außerdem hatte ich die gleichen Zip-Pakete am Speicherort: \ Users \ user \ AndroidStudioProjects \ git \ appname \ app \ libs \ google-http-client-1.23!.

Das war also überflüssig und deshalb findet gradle 2 Dateien. Also habe ich meine Zip-Pakete gelöscht und die Fehler für mich behoben. Seien Sie dabei vorsichtig. Sie müssen herausfinden, welche Datei oder welches Paket zum Löschen die richtige ist.

Drittens erstellt gradle auch eine Zip-Datei dieser Fehlerdateien an diesem Speicherort (zumindest für mich) - C: \ Programme \ Android \ Android Studio \ gradle \ m2repository \ com \ google \ code \ findbugs \ jsr305 \ 1.3. 9 \ jsr305-1.3.9.jar!

Also habe ich auch die Datei jsr305-1.3.9.jar von hier gelöscht.

Wenn Sie immer noch verwirrt sind, gehen Sie einfach in Android Studio auf "Überall suchen", suchen Sie dort nach Instanzen Ihrer Datei, und Sie müssten eine davon löschen. Nehmen Sie sich Zeit und finden Sie heraus, welche.

Vi012
quelle
3

Hinzufügen

android.useAndroidX = true

android.enableJetifier = true

zu gradle.properties hat bei mir funktioniert.

Parag Jain
quelle
1

Ich war mit diesem Problem konfrontiert, zuerst mit einigen nativen Bibliotheken (.so-Dateien) und dann mit Java / Kotlin-Dateien. Es stellte sich heraus, dass ich eine Bibliothek aus dem Quellcode aufgenommen und durch eine transitive Abhängigkeit künstlich referenziert habe. Überprüfen Sie Ihren Abhängigkeitsbaum, um festzustellen, ob redundante Einträge vorhanden sind. Verwenden Sie ./gradlew :app:dependenciesdiese Option , um den Abhängigkeitsbaum abzurufen. Ersetzen Sie "App" durch Ihren Modulnamen, wenn der Name des Hauptmoduls unterschiedlich ist.

ben_joseph
quelle
1

Fügen Sie Folgendes in der Gradel-Datei auf App-Ebene in Android {} hinzu

packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude("META-INF/*.kotlin_module") 
      } 
Mirza Ahmed Baig
quelle
0

Versuchen Sie, Multidex aus der Standardkonfiguration zu entfernen, und überprüfen Sie das Build-Fehlerprotokoll. Wenn dieses Protokoll mit der INotification-Klasse verknüpft werden kann. Verwenden Sie dies in Android {}

configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}

Das hilft mir.

Harter Mittal
quelle
0

Für mich unten Lösung funktioniert, können Sie auch Hilfe bekommen, schrieb ich unten Zeile in der Gradle-Datei der App

  packagingOptions {
        exclude 'META-INF/proguard/androidx-annotations.pro'
    }
Jaykishan Sewak
quelle
0

Ich war verkabelt, aber mein Projekt wurde bereits auf AndroidX migriert, aber nach der erneuten Migration auf AndroidX wurde ein Teil meines Projekts überarbeitet und das Problem behoben.

SinaMN75
quelle
0

Versuchen Sie, die minimale Android-Version> = 21 in Ihrem build.gradle android {} zu ändern

Jemt tinhwa
quelle
-1

Für mich war es eher .md als .txt

packagingOptions {
    exclude 'META-INF/LICENSE.md'
    exclude 'META-INF/NOTICE.md'
}
Amin Keshavarzian
quelle
-1

In vielen Antworten auf SO zu diesem Problem wurde vorgeschlagen, hinzuzufügen exclude 'META-INF/DEPENDENCIES' einige andere Ausschlüsse und einige andere auszuschließen. Allerdings hat keines davon für mich funktioniert. In meinem Fall war das Szenario so:

Ich hatte dies in Abhängigkeiten hinzugefügt:

implementation 'androidx.annotation:annotation:1.1.0'

Und auch ich hatte dies in gradle.properties hinzugefügt:

android.useAndroidX=true

Beides hatte ich hinzugefügt, weil ich den Build-Fehler "Symbolklasse Nullable kann nicht gefunden werden" erhielt und es als Lösung für einige Antworten wie hier vorgeschlagen wurde

Irgendwann landete ich jedoch in einem Fehler:

 More than one file was found with OS independent path 'androidsupportmultidexversion.txt'

Nein hat excludefür mich gearbeitet. Schließlich habe ich die oben hinzugefügten Zeilen aus Suspecion entfernt (Gelöst 'Symbolklasse Nullable kann auf keine alternative Weise gefunden werden') und schließlich diesen Build-Fehler "Es wurde mehr als eine Datei mit Betriebssystem gefunden ..." entfernt. Ich habe Stunden von mir verschwendet. Aber endlich losgeworden.

Atul
quelle
-1

Nach dem Bereinigen des Projekts müssen Sie nur noch den Cache ungültig machen und neu starten

E.Akkok
quelle