Не используйте более позднюю версию библиотеки из транзитивной зависимости в 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'
     }
 }
Другие вопросы по тегам