Не используйте более позднюю версию библиотеки из транзитивной зависимости в Gradle
В моем проекте Android я использую
compile 'com.squareup.okhttp:okhttp:2.2.0'
Мне нужно okhttp в версии 2.2.0 для моего кода для правильной работы. Но у меня проблема, когда я добавляю
compile('io.intercom.android:intercom-sdk:1.1.2@aar') {
transitive = true
}
Потому что внутри intercom-sdk снова есть зависимость okhttp для более поздней версии:
compile 'com.squareup.okhttp:okhttp:2.4.0'
В результате чего мой код использует эту более позднюю версию 2.4.0 вместо 2.2.0, которую я хочу. Есть ли, пожалуйста, способ, как в моем модуле я могу использовать 2.2.0, который я указал, и позволить внутренней связи использовать его 2.4.0?
2 ответа
Вы можете использовать что-то вроде этого:
compile('io.intercom.android:intercom-sdk:1.1.2@aar') {
exclude group: 'com.squareup.okhttp', module: 'okhttp'
}
Однако обратите внимание. Если в библиотеке используются методы, отсутствующие в выпуске 2.2.0, произойдет сбой.
Вы должны определить стратегию разрешения для установки конкретной версии. Это гарантирует, что вы получите правильную версию, которую вы хотите, независимо от того, какие версии транзитивной зависимости:
allProjects {
configurations.all {
resolutionStrategy {
eachDependency { DependencyResolveDetails details ->
if (details.requested.name == 'okhttp') {
details.useTarget('com.squareup.okhttp:okhttp:2.2.0')
}
}
}
}
}
В новых версиях Gradle вы можете использовать:
allProjects {
configurations.all {
resolutionStrategy.force 'com.squareup.okhttp:okhttp:2.2.0'
}
}