2017-01-04 17 views
16

Po uruchomieniu: gradlew assembleDebug polecenia na root projektu Android studio. Proces budowy nie nad otrzymuję komunikat:: transformClassesWithJarMergingForDebug '. TransformException: java.util.zip.ZipException: duplikat wpisu podczas uruchamiania gradlew assembleDebug

co poszło źle:

Wykonanie nie powiodło się dla zadania ': app: transformClassesWithJarMergingForDebug'. com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplikat wpisu: org/slf4j/impl/StaticLoggerBinder.class

W moim projekcie istnieją dwa pliki jar: slf4j -android-1.6.1-RC1.jar i slf4j-log4j12-1.7.21.jar. I oba te słoiki zawierają dwa słoiki, które zawierają org.sl4j.impl.StaticLoggerBinder.

Oto moja Gradle zawartość który znajduje się na folderze app plik:

android { 
    compileSdkVersion 23 
    buildToolsVersion "22.0.1" 
    defaultConfig { 
     applicationId "com.ias.caniasandroid" 
     minSdkVersion 18 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    dexOptions { 
     jumboMode true 
     javaMaxHeapSize "4g" 
    } 
    productFlavors { 
    } 
} 

dependencies { 
    debugCompile fileTree(include: ['*.jar'], dir: 'libs') 
    debugCompile files('libs/commons-lang3-3.4.jar') 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
} 

Jak mogę rozwiązać ten problem i uruchomić gradlew assembleDebug powodzeniem bez zmiany zawartości plików jar?

+0

nie wolno używać słoików. Importuj artefakty z maven, konflikty są rozwiązywane automatycznie (jeśli mogą, najczęściej przez wybranie najnowszej z wszystkich określonych wersji artefaktu). –

+0

Czy naprawdę potrzebujesz dwóch bibliotek * slf4j-log4j12 * i * slf4j-android *? A może jeden jest wystarczający. Spróbuj użyć tylko jednej zależności zamiast dwóch plików jar 'compile 'org.slf4j: slf4j-log4j12: 1.7.21'' –

Odpowiedz

9

Wystarczy usunąć z poniższych klas z slf4j-android-1.6.1-RC1 słoiku

org/sl4j/impl/StaticLoggerBinder.class 
org/sl4j/impl/StaticMarkerBinder.class 
org/sl4j/impl/StaticMDCBinder.class 

Można wykluczyć szczególną klasę ze słoika w Gradle uzależnienia.

Aby to zrobić, rozpakuj słoik za pomocą zadania Copy, wykryj żądaną klasę, a następnie dodaj zależność od wyodrębnionych klas.

task unzipJar(type: Copy) { 
    from zipTree('slf4j-android-1.6.1-RC1.jar') 
    into ("$buildDir/libs/slf4j") //TODO: you should update this line 
    include "**/*.class" 
    exclude "org/sl4j/impl/StaticLoggerBinder.class" 
    exclude "org/sl4j/impl/StaticMarkerBinder.class" 
    exclude "org/sl4j/impl/StaticMDCBinder.class" 
} 

dependencies { 
    compile files("$buildDir/libs/slf4j") { 
     builtBy "unzipJar" 
    } 
} 

Uwaga: Czyni everythime gdy kody są kompilacji.

Z drugiej strony, jeśli nie chce się skompilować pakiet, ale jeśli chcesz je skompilować i wykluczyć z JAR można użyć

jar { 
    exclude('org/sl4j/impl/**') 
} 
+0

Domyślam się, że wiele wersji tej samej biblioteki ma większość klas wspólnych. W końcu będziesz miał kilka nieużywanych, przestarzałych klas z jednej wersji i wszystko z innej. @bahtiyartan Całkowicie usunięcie jednego z słoików jest w tym przypadku sposobem. –

Powiązane problemy