不要在 Gradle 中使用来自传递依赖的更高版本的库
Don't use later library version from transitive dependency in Gradle
在我的 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'
}
}
在我的 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'
}
}