不要在Gradle中使用传递依赖的最新库版本。

3

在我的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版本,并让intercom使用它的2.4.0版本?

2个回答

4
您可以使用类似以下的方式:

您可以这样做:

compile('io.intercom.android:intercom-sdk:1.1.2@aar') {
    exclude group: 'com.squareup.okhttp', module: 'okhttp'
  }

但是请注意,如果该库使用了2.2.0版本中不存在的方法,则会失败。


谢谢。这正是我担心的,因为我已经尝试过了,就像你说的那样它失败了。如果我删除传递性,你能否解释一下会发生什么? - bakua
жҚ®ж€‘ж‰ЂзџӨпәЊеҢ“ж‚Ёж·»еЉ @a​​arжіЁй‡Љж—¶пәЊдёғдғ†е…·жњ‰дә йЂ’дңқиµ–йҰ№пә€еҚідңқиµ–йҰ№зљ„дңқиµ–йҰ№пә‰пәЊж‚Ёеғ”添加“transitive = trueвЂқгЂ‚ - Gabriele Mariotti
现在需要使用组ID:com.squareup.okhttp3 - Tobrun

3

您应该定义一个解析策略来设置特定版本。这将确保无论传递依赖关系的版本如何,您都可以获得所需的正确版本:

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

谢谢。但这会不会强制我的对讲依赖同样使用2.2.0?或者对讲是否继续使用2.4.0? - bakua
在依赖配置中,您只能拥有一个版本的jar。如果您想要两个或更多版本,则需要将它们放在单独的依赖项中,并将依赖项组合为输出。您还需要确保不同的库在运行时以唯一的类加载器加载。 - cmcginty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接