gradle - 使用`implementation`时的Gradle依赖冲突
问题描述
我有一个包含两个 gradle 模块的项目:lib
和app
. 我刚刚更改了lib
build.gradle 以停止暴露依赖项(即我从api
->移动implementation
)。该app
模块不直接依赖于 OkHttp 日志拦截器,所以我认为最好不要公开它。
lib
模块的 build.gradle:
dependencies {
// api 'com.squareup.okhttp3:logging-interceptor:3.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
...
}
app
模块的 build.gradle:
dependencies {
implementation project(':lib')
implementation group: 'com.zendesk', name: 'support-providers', version: '2.0.0'
...
}
但是我现在看到一个编译问题:
与项目“:app”中的依赖项“com.squareup.okhttp3:logging-interceptor”冲突。运行时类路径 (3.10.0) 和编译类路径 (3.8.1) 的已解决版本不同
如果我查看项目结构,我会看到:
+--- project :lib
...
+--- com.zendesk:support-providers:2.0.0
| +--- com.zendesk:core:1.0.0
| | +--- com.zendesk:java-common:1.13
| | +--- com.google.dagger:dagger:2.12 -> 2.15 (*)
| | +--- com.squareup.retrofit2:retrofit:2.3.0
| | | \--- com.squareup.okhttp3:okhttp:3.8.0 -> 3.8.1
| | | \--- com.squareup.okio:okio:1.13.0
| | +--- com.squareup.retrofit2:converter-gson:2.3.0
| | | +--- com.squareup.retrofit2:retrofit:2.3.0 (*)
| | | \--- com.google.code.gson:gson:2.7
| | +--- com.squareup.okhttp3:logging-interceptor:3.8.1 // <----- SEE HERE
| | | \--- com.squareup.okhttp3:okhttp:3.8.1 (*)
| | +--- com.squareup.okhttp3:okhttp:3.8.1 (*)
| | +--- com.android.support:support-annotations:27.0.2 -
lib
没有透露它的任何依赖项(显然)并且app
依赖于 Zendesk sdk,它依赖于不同版本的 OkHttp 日志拦截器。
我只看到两种解决方法:
api -> implementation
在模块中恢复lib
,从而将日志拦截器暴露给app
模块- 声明对日志拦截器的顶级依赖并设置为 3.10 以强制 Zendesk 使用最新的:
app
构建.gradle:
dependencies {
implementation project(':lib')
implementation group: 'com.zendesk', name: 'support-providers', version: '2.0.0'
// used just to force zendesk to use 3.10
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
...
}
这些看起来都不是很干净。IMOapp
模块不应该对 OkHttp 日志拦截器一无所知。还有其他选择吗?
如果 Zendesk 更新了他们的库以implementation
用于他们的 OkHttp 依赖项,这会解决问题吗?Gradle 是否会让两个依赖项使用相同传递依赖项的不同版本,只要它们不暴露给整个项目吗?
解决方案
使用 Gradle 这有点不同......
可以强制执行版本3.10.0
:
dependencies {
implementation group: 'com.zendesk', name: 'support-providers', version: '2.0.0'
}
configurations.all() {
resolutionStrategy.force "com.squareup.okhttp3:logging-interceptor:3.10.0"
}
或者只是排除版本3.8.1
(除了所需的版本之外什么都没有3.10.0
):
dependencies {
implementation ('com.zendesk:support-providers:2.0.0") {
exclude "com.squareup.okhttp3:logging-interceptor:3.8.1"
}
}
推荐阅读
- python - Pandas df.to_csv() 保存我的文件的旧版本,而不是我修改过的文件
- dart - 工厂构造函数相对于独立工厂类或函数有什么优势?
- python - 带有隐藏列的 Webscraping jTable?
- c# - GridView 中哪些复选框发生了变化
- webpack - 如何在基于 Create-React-App 的应用程序中配置 Workbox?
- sql - 带有值列表中字段值的 SQL SELECT 语句
- vue.js - Vue实例之间如何通信
- c - 为什么在获取整数作为输入时不需要 getchar() ?
- php - 如何制作有效的搜索表单 PHP/HTML?
- dataframe - 如何以正确的格式以科学记数法显示 PySpark 数据框中的列