Приложение: transformClassesWithJarMergingForDebug. TransformException: java.util.zip.ZipException: дублировать запись во время выполнения gradlew assembleDebug

Когда я запускаю команду gradlew assembleDebug в корневом проекте студии Android. Процесс сборки не работает, я получаю это сообщение:

Что пошло не так:

Выполнение не выполнено для задачи ': app: transformClassesWithJarMergingForDebug'. com.android.build.api.transform.TransformException: java.util.zip.ZipException: дублировать запись: орг/SLF4J/осущ/StaticLoggerBinder.class

В моем проекте есть два файла jar: slf4j-android-1.6.1-RC1.jar и slf4j-log4j12-1.7.21.jar. И оба эти баночки содержат две банки, которые включают org.sl4j.impl.StaticLoggerBinder.

Вот мой контент файла gradle, который находится в папке приложения:

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

Как я могу исправить проблему и успешно запустить gradlew assembleDebug без изменения содержимого файлов jar?

Ответы

Ответ 1

Просто удалите приведенные ниже классы из slf4j-android-1.6.1-RC1 jar

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

Вы можете исключить определенный класс из jar в зависимости от gradle.

Чтобы сделать это, разархивируйте банку с помощью задачи Copy, исключите нужный класс и затем добавьте зависимость файла от извлеченных классов.

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

Примечание: каждый раз, когда ваши коды компилируются.

С другой стороны, если вы не хотите компилировать пакет, но если вы хотите скомпилировать их и исключить из своего JAR, вы можете использовать

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