Don';t使用Gradle中可传递依赖项的较新库版本

Don';t使用Gradle中可传递依赖项的较新库版本,gradle,dependencies,build.gradle,transitive-dependency,Gradle,Dependencies,Build.gradle,Transitive Dependency,在我的Android项目中,我使用 compile 'com.squareup.okhttp:okhttp:2.2.0' 我需要版本2.2.0中的okhttp才能使我的代码正常工作。但我在添加时遇到了一个问题 compile('io.intercom.android:intercom-sdk:1.1.2@aar') { transitive = true } 因为在intercom sdk中,对于更高版本,仍然存在okhttp依赖关系: compile 'com.square

在我的Android项目中,我使用

compile 'com.squareup.okhttp:okhttp:2.2.0'
我需要版本2.2.0中的okhttp才能使我的代码正常工作。但我在添加时遇到了一个问题

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?

您可以使用以下内容:

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

谢谢这正是我所担心的,因为我已经尝试过了,正如你所说,它失败了。请您解释一下,如果我删除transitive,会发生什么情况?我知道,当您添加@aar注释时,要使依赖项可传递((即依赖项的依赖项),您应该添加“transitive=true”。标记现在您需要使用组id:
com.squareup.okhttp3
谢谢。但这不会迫使我的对讲机依赖项也使用2.2.0吗?或者对讲机会继续使用2.4.0吗?依赖项配置中只能有一个jar版本。如果您想要两个或更多版本,您需要将它们放在单独的依赖项中因此,组合输出的依赖项。您还需要确保在运行时将不同的LIB加载到唯一的classloade中。