java util zip ZipException: дублирующая запись

#android #android-studio #gradle #error-handling #exception-handling

#Android #android-studio #gradle #обработка ошибок #обработка исключений

Вопрос:

При запуске проекта я получаю эту ошибку

Ошибка: не удалось выполнить задачу ‘:……….’. com.android.build.api.transform.Исключение TransformException: java.util.zip.ZipException: дублирующая запись: javax/annotation/CheckForNull.class

Вот как выглядит мое приложение: gradle :

 apply plugin: 'com.android.application'

android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
useLibrary  'org.apache.http.legacy'

defaultConfig {
    applicationId "com.sample.Example"
    minSdkVersion 15
    targetSdkVersion 24
    multiDexEnabled true
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}

dependencies {
compile (project(':library')){
    exclude module: 'support-v4'
}
compile (project(':facebookLib')){
    exclude module: 'support-v4'
}
compile 'com.google.http-client:google-http-client-gson:1.20.0'
compile 'com.google.code.gson:gson:2.4'
compile files('libs/CWAC-SackOfViewsAdapter.jar')
compile files('libs/FlurryAgent.jar')
compile files('libs/google-api-client-1.15.0-rc.jar')
compile files('libs/google-api-client-android-1.15.0-rc.jar')
compile files('libs/google-api-services-androidpublisher-v1-rev15-1.15.0-rc.jar')
compile files('libs/google-http-client-1.15.0-rc.jar')
compile files('libs/google-http-client-android-1.15.0-rc.jar')
compile files('libs/google-http-client-jackson-1.15.0-rc.jar')
compile files('libs/google-http-client-jackson2-1.15.0-rc.jar')
compile files('libs/google-oauth-client-1.15.0-rc.jar')
compile files('libs/google-oauth-client-java6-1.15.0-rc.jar')
compile files('libs/httpmime-4.2.jar')
compile files('libs/in-app-purchasing-1.0.3.jar')
compile files('libs/jackson-core-2.1.3.jar')
compile files('libs/jackson-core-asl-1.9.11.jar')
compile files('libs/json_simple-1.1.jar')
compile files('libs/jsr305-1.3.9.jar')
compile files('libs/picasso-2.1.1.jar')
compile files('libs/signpost-commonshttp4-1.2.1.1.jar')
compile files('libs/signpost-core-1.2.1.1.jar')
compile files('libs/signpost-jetty6-1.2.1.1.jar')
compile files('libs/twitter4j-core-4.0.1.jar')
compile files('libs/amazon-device-messaging-1.0.1.jar')
compile 'com.google.android.gms:play-services:9.6.1'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.android.support:cardview-v7:24.2.1'
compile 'com.android.support:multidex:1.0.1'
}
  

volley: gradle

 android {
compileSdkVersion 17
buildToolsVersion "24.0.3"

defaultConfig {
    minSdkVersion 8
    targetSdkVersion 8
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}
  

библиотека: gradle

 android {
compileSdkVersion 16
buildToolsVersion "23.0.3"

defaultConfig {
    minSdkVersion 4
    targetSdkVersion 4
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}

dependencies {
compile 'com.android.support:support-v4:18.0.0'
}
  

facebookLib: gradle

 android {
compileSdkVersion 17
buildToolsVersion "24.0.3"

defaultConfig {
    minSdkVersion 8
    targetSdkVersion 8
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}

dependencies {
compile 'com.android.support:support-v4:18.0.0'
}
  

Может кто-нибудь предложить выход из этой ошибки?
Заранее спасибо.

Ответ №1:

 com.android.support:support-v4:_____
  

Эта библиотека используется несколько раз. Итак, вот что вы можете сделать. сделайте это либо в gradle вашей библиотеки, либо в gradle facebooklib:

 compile(project(':facebookLib')) {
    exclude module: 'support-v4'
}
  

или

 compile(project(':library')) {
    exclude module: 'support-v4'
}
  

Совет: вы должны создать задачу gradle для печати ваших зависимостей при сборке и взглянуть на нее. Посмотрите, есть ли что-нибудь, что вы можете удалить / улучшить

Редактировать:

запустите эту команду на вкладке терминала вашей Android Studio.

 ./gradlew app:dependencies
  

При этом будут распечатаны все зависимости и их (вспомогательные) зависимости. Просмотрите ее и посмотрите, какая из зависимостей вызывается дважды, где.

Каждый раз, когда вы дважды видите одну и ту же библиотеку, вы должны использовать exclude метод, показанный выше, чтобы исключить этот элемент или группу.

Смотрите Здесь для получения более подробной информации. Это хорошее и простое объяснение. https://www.linkedin.com/pulse/how-find-dependencies-particular-dependency-gradle-hesamedin-kamalan-1

Комментарии:

1. получение ошибки при синхронизации gradle> Не удалось найти метод exclude() для аргументов [{module= support-v4}] в project ‘: library’ типа org.gradle.api.Project.

2. @Shahal посмотрите на мое редактирование. Это проект, поэтому вам нужен дополнительный набор круглых скобок. я забыл, что :

3. получение того же исключения . но exclude() не вызвал никакой ошибки.

4. у вас также есть одна и та же библиотека в вашем основном проекте, поэтому исключите ее из обоих проектов, facebookLib и library . У вас длинный список зависимостей, и это такая распространенная библиотека. Я уверен, что какая-то другая библиотека или проект тоже ее используют

5. добавлен код исключения для обоих моих проектов, по-прежнему получающих одно и то же исключение. ps: я отредактировал приведенный выше код.

Ответ №2:

Выполните следующее, чтобы найти дубликаты

 task findDuplicates {
   doLast {
      String findMe = 'javax/annotation/CheckForNull.class'
      configurations.compile.files.each { file ->
         if (file.name.endsWith('.jar')) {
            def classMatches = zipTree(file).matching {
               include findMe
            }.files
            if (!classMatches.empty) {
               println "Found $findMe in $file ${classMatches.size()} time(s)"
            }
         }
      }
   }
}
  

Комментарии:

1. Я не могу запустить проект в первую очередь, чтобы сделать все это.

2. да, вы можете запустить gradle findDuplicates после добавления моего фрагмента в свой build.gradle

3. Я получаю «Ошибка: (28, 1) Не удалось выполнить задачу»: найти дубликаты». > Не удалось получить неизвестное свойство ‘runtime’ для контейнера конфигурации «.

4. Изменено на configurations.compile.x

Ответ №3:

Вы могли бы выполнить очистку зависимостей в Android Studio. При этом вы найдете ссылки на библиотеки для каждого модуля в виде дерева. Таким образом, вы узнаете, какие зависимости генерируют ошибку дублирования записи. Найдите в своем проекте, на какие файлы ссылаются ссылки CheckForNull.class . Обратите внимание на пакет, который его содержит.

Откройте окно терминала в вашем проекте и выполните команду follow

 gradlew clean app:dependencies
  

Обратите внимание, что ВСЕ зависимости будут удалены и загружены повторно. Если у вас много библиотек gradle, повторная загрузка может занять пару минут. После этого вы найдете сводку, в которой вы можете отфильтровать пакет, который вы нашли. В моем случае проблема была с пакетом apache.commons. Я выполняю фильтр и нахожу что-то вроде этого:

  --- com.amazonaws:aws-android-sdk-s3:2.4.0
|     --- com.amazonaws:aws-android-sdk-core:2.4.0 (*)
|     --- com.amazonaws:aws-android-sdk-kms:2.4.0
|    |    --- com.amazonaws:aws-android-sdk-core:2.4.0 (*)
|     --- org.apache.commons:commons-io:1.3.2
|    |    --- commons-io:commons-io:1.3.2 -> 2.4
|     --- commons-io:commons-io:2.4
|    --- org.bouncycastle:bcprov-jdk16:1.44
  

В моем случае это была дублирующая запись, сгенерированная AWS Android SDK, относящаяся к зависимости commons-io.

Наконец, просто сделайте исключение в своем файле gradle следующим образом (помните, что в моем случае это была зависимость diffenrt):

 compile('com.amazonaws:aws-android-sdk-s3:2.4.0')
        {
            exclude group: 'org.apache.commons'
        }
  

Ответ №4:

Вам не нужно компилировать одни и те же зависимости в каждом отдельном модуле, поскольку ваше приложение: gradle компилируется 'com.android.support:support-v4:24.2.1' , которое уже было скомпилировано в вашей библиотеке gradle как 'com.android.support:support-v4:18. ‘где я вижу, что вы добавили библиотечный модуль в качестве зависимости к app: gradle, здесь вы пытаетесь его реплицировать. То же самое относится и к другим модулям. Если они не являются независимыми.

Совет: также не используйте анонимные версии, например 'com.android.support:support-v4:18. ' , вместо этого используйте соответствующие версии.

Ответ №5:

Build -> Rebuild Project в Android Studio исправил это для меня.