强制依赖版本
默认情况下依赖冲突Gradle会使用高版本的依赖
但是很多时候不兼容,因此出现了强制依赖版本的几个关键字
1) isFoce
isFoce 标记会强制使用该标记版本的依赖
dependencies {
implementation("io.reactivex.rxjava2:rxjava:2.2.6") {
isForce = true
}
implementation("io.reactivex.rxjava2:rxjava:2.2.10")
}
// 依赖决议使用 2.2.6 版本
作用规则:
- 同一个 module 中,对同一个依赖多次书写 isForce,只有第一个会生效,后面的都没用
- isForce 只作用于当前模块, 不同模块中的 isForce 相互独立
- isForce 跨模块,这些模块相互依赖,那么以 app 的 isForce 为准,因为 app 的 脚本先执行
- isForce 的版本并不会反映到 POM 文件中, 这个必须清楚,要使用 isForce 一定要谨慎
缺点:
force 的版本不能比 app 主模块的版本低,要不就报错。比如 app 模块依赖于 lib, 如果 app 中引入了 rxjava:2.2.10, lib 却 force 了 rxjava:2.2.6 则会发生编译错误。这种情况下需要在app中进行force,lib中移除force 因为只能force一次app先构建
2) strictly
strictly 是一种强力依赖版本约束,官方现在推荐使用这个,可以用 !! 简写
dependencies {
implementation("io.reactivex.rxjava2:rxjava:2.2.0!!")
implementation("io.reactivex.rxjava2:rxjava") {
version {
strictly("2.2.0")
}
}
}
这样就会强制使用 2.2.0 版本的依赖了。
但是同样也有问题 ,constraints 的版本不能比其他的低,要不也会报错,下面的代码就是有问题的,会报错
这个感觉并不是问题,依赖声明的是高版本,为什么需要用低版本,直接依赖低版本不久好了吗
dependencies {
implementation("io.reactivex.rxjava2:rxjava:2.2.4")
constraints {
implementation("io.reactivex.rxjava2:rxjava:2.2.0!!")
}
}
通过hook Gradle生命周期进行修改
//指定使用的版本是26.1.0
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '26.1.0'
}
}
}
}
禁止依赖传递
也就是传递到compilePath中出现的冲突,transitive 让我们自己选择是不是要把依赖传递下去
举例
app implementation libs、libs api rxandroid,这样我们在 app 中也能够使用 rxandroid 的 API,我们给 libs api rxandroid 设置 transitive(false) 后,app 中就找不到 rxandroid 的类库了,因为依赖无法被传递了
api("io.reactivex.rxjava2:rxandroid:2.1.1"){
transitive(false)
}
标签:依赖,app,isForce,Gradle,冲突,版本,rxjava,2.2
From: https://blog.51cto.com/u_14689064/5787334