Подтвердить что ты не робот

Ошибка конфликта зависимостей в моем Android-приложении, в котором есть тесты на Android

Я использую AndroidStudio и Gradle для сборки своего Android-приложения с тестами в исходном каталоге androidTest. Я добавил новую зависимость, и теперь я получаю следующую проблему при запуске Android Tests либо в AndroidStudio, либо через. /gradlew connectedCheck. Какой предпочтительный способ разрешить это?

'Предупреждение: конфликт с зависимостью "org.somelibrary: library-core". Решенные версии для приложения и тестового приложения отличаются. '

Как и для Android Gradle Плагин 1.1.1, ошибка отображается следующим образом: "Предупреждение: конфликт с зависимостью" com.google.code.findbugs: jsr305. Решенные версии для приложения (1.3.9) и тестового приложения (2.0.1) отличаются. "

4b9b3361

Ответ 1

Когда вы создаете и запускаете Android-тесты для своего приложения, плагин Android Gradle создает два APK (приложение и тестовый APK). Во время Gradle выполняется сравнение зависимостей для приложений и тестовых сборок. Зависимости, существующие в обоих, удаляются из тестовой сборки, когда номера версий одинаковы. Когда одни и те же зависимости используются, но отличаются по номеру версии, вам необходимо вручную разрешить конфликт зависимостей и представить эту ошибку.

Чтобы разрешить конфликт, вам сначала нужно выяснить две противоречащие друг другу версии. Если вы еще не используете Android Gradle Plugin v1.1.1 +, то, если вы перейдете на эту версию, сообщение об ошибке даст вам конфликтующие номера версий. Выберите тот, который вам нужен.

* При выборе между номерами конфликтов важно иметь в виду, что, если вы не переопределили стратегию разрешения зависимостей по умолчанию Gradle (failOnVersionConflict), тогда конфликты внутри приложения и тестовые сборки (отдельно) будут решены путем выбора большей версии.

Теперь вам нужно решить, как разрешить конфликт. Если вам нужно принудительно использовать более низкую версию (1.2) библиотеки, вам нужно будет принудительно разрешить зависимость для обоих приложений и тестовых сборников для конкретной версии библиотеки следующим образом:

// Needed to resolve app vs test dependencies, specifically, transitive dependencies of
// libraryq and libraryz. Forcing the use of the smaller version after regression testing.
configurations.all {
    resolutionStrategy.force 'org.somelibrary:library-core:1.2'
}

Если вам нужно использовать версию зависимостей версии 2.1, вы можете использовать вышеприведенный фрагмент, но вы никогда не начнете использовать более новую версию библиотеки, независимо от того, требуются ли ей обновления транзитивной зависимости. В качестве альтернативы вы также можете добавить новую нормальную зависимость либо к приложению, либо к тестовым сборкам (в зависимости от того, какая из них пыталась использовать версию версии 1.2). Это заставит приложение или тестовую сборку зависеть от ранее упомянутой стратегии разрешения зависимостей Gradle и, следовательно, использовать версию библиотеки 2.1 для этой сборки.

// Force the use of 2.1 because the app requires that version in libraryq transitively.
androidTestCompile 'org.somelibrary:library-core:2.1'

или

// Force the use of 2.1 because the Android Tests require that version in libraryz.
compile 'org.somelibrary:library-core:2.1'

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

Обновление. Несколько новых решений по этому вопросу теперь также перечислены за исключением конкретной транзитивной зависимости от заявленной зависимости. Это правильное решение, но накладывает больше внимания на разработчиков. Точно так же, как предложение о разрешении принудительной зависимости выше выше жестко кодирует версию в сборку, решение исключающей транзитивной зависимости специально переопределяет заявленные требования библиотеки. Иногда разработчики библиотеки имеют ошибки или работают с ошибками в разных других библиотеках, поэтому при реализации этих решений вы рискуете потенциально преследовать очень неясные ошибки.

Ответ 2

Была аналогичная проблема. Сначала я обновляю плагин gradle до 1.1.1 (в проекте gradle):

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

который помог мне понять, что проблема была в приложении, относящемся к:

com.android.support:support-annotations:21.0.3

в то время как тестовое приложение ссылалось на:

com.android.support:support-annotations:20.0.0  

(из-за указания androidTestCompile 'com.squareup.assertj:assertj-android-appcompat-v7:1.0.0')

решил его, указав:

androidTestCompile 'com.android.support:support-annotations:21.0.3'

Ответ 3

В качестве альтернативы можно исключить конфликтующую зависимость (например, библиотеку аннотаций поддержки), втянутую зависимостью тестового приложения (например, assertj-android), используя следующее:

testCompile('com.squareup.assertj:assertj-android:1.0.0') { exclude group: 'com.android.support', module: 'support-annotations' }

Ответ 4

Gradle имеет Механизм стратегии разрешения.

Вы можете разрешить этот конфликт, добавив ниже строки в файл уровня сборки build.gradle:

configurations.all {
    resolutionStrategy {
        force 'com.google.code.findbugs:jsr305:1.3.9', 'com.google.code.findbugs:jsr305:2.0.1'
    }
}

Ответ 5

Если вы посмотрите на (сгенерированный).iml файл (ы), вы можете легко просмотреть конфликтующие номера версий. В моем случае:

<orderEntry type="library" exported="" scope="TEST" name="support-annotations-20.0.0" level="project" />
<orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />

Возврат к версии 1.0.1 плагина gradle устраняет проблему.