gradle - 如果添加了 okhttp-urlconnection 依赖项,则拆分包 "okhttp3"错误构建

标签 gradle dependencies okhttp java-9

我正在使用 OkHttp3 为纯 Java 应用程序构建一个简单的连接 API,但我遇到了一个构建问题,该问题似乎是由 Square 对多个依赖项工件使用相同的包名称这一事实引发的。

我之前看过一些讨论 Maven 依赖项和来自 Eclipse 的消息传递的问答,但所有这些都表明即使 Eclipse 使用模块错误注释导入,Maven 或 Gradle 构建仍然有效。在这种情况下,只要我简单地添加一个依赖项并且不做任何其他更改,Gradle 构建就会失败。

该应用是纯 Java 11 模块构建。我正在使用具有 Gradle 特性的最新 Eclipse 作为 IDE,但我认为这不是严格相关的。我正在使用 OkHttp3 将私有(private)端点转换为 API,其中一个端点需要 CookieJar。希望只使用默认实现,我将 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' 添加为已经引入 'com.squareup 的项目的依赖项.okhttp3:okhttp:3.14.9' 作为传递依赖。这两者在技术上都使用相同的包名称提供类:“okhttp3”。

例如,我所做的就是取消注释这段代码中看到的依赖行并保存 build.gradle:

dependencies {
    implementation ('com.squareup.retrofit2:retrofit:2.9.0')
    implementation ('com.squareup.retrofit2:converter-gson:2.9.0')
    implementation ('com.squareup.okhttp3:logging-interceptor:3.14.9')
//  implementation ('com.squareup.okhttp3:okhttp-urlconnection:3.14.9')

项目一刷新,我就在 Eclipse 中获得了所有“okhttp3”导入的注释:

The package okhttp3 is accessible from more than one module: okhttp3, okhttp3.logging, okhttp3.urlconnection

干净的构建会导致:

$ ./gradlew clean build

[...]

> Task :compileJava FAILED
error: the unnamed module reads package okhttp3 from both okhttp3.urlconnection and okhttp3
error: module retrofit2.converter.gson reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
error: module retrofit2 reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
error: module org.apache.commons.io reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
error: module httpcore5 reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
[...]

我认为这不重要,但我使用的是 Gradle wrapper 5.6.4。

据我所知,所有 OkHttp3 库都设置了足以满足 Java 9+ 的模块信息。 Eclipse 中的模块似乎对此很满意。看起来 Eclipse 或 Gradle 都不喜欢两个不同的依赖项将它们的 Java 包宣传为“okhttp3”这一事实。在我看来,任何使用 Java 9 或更高版本的基于 Gradle 或 Maven 的项目都会因拆分包依赖而失败。

根据我在其他地方读到的一些建议,我尝试从传递地包含它的所有依赖项中排除 'com.squareup.okhttp3:okhttp' 然后单独拉入它,但这确实无济于事(不是我想的那样,但此时我正在尝试任何冰雹玛丽)。

解决方法包括将我想要的两个 Kotlin 类直接拖放到项目中并以这种方式重命名包。这是一个令人震惊的黑客攻击,可能违反了图书馆许可。我也可以直接实现我需要的 cookie 东西,但我很懒(虽然,显然,我想把我的精力花在解决这个问题上,而不是使用我已有的接口(interface)实现一个 cookie 类)。

我觉得这是 Square 以及他们如何打包这些库/模块的错误。由于他们非常关注 Android,也许我是唯一一个想要在 Java 9 或更高版本上使用 okhttp-urlconnection 的人?所以,这个问题更多的是关于我是否应该将其作为缺陷提出来,而且也许我忽略了一些明显的东西。

最佳答案

这是 OkHttp 的错,我们可以为您解决。请打开一个带有指向此问题的链接的跟踪错误。

我们会将这两个类移动到一个新包中。为了向后兼容,我们还需要将委托(delegate)实现留在后面。希望工具允许这样做!

JPMS 有这个约束太糟糕了。我们已经修复了一些其他开源项目,但没有修复这个项目。

关于gradle - 如果添加了 okhttp-urlconnection 依赖项,则拆分包 "okhttp3"错误构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62758635/

相关文章:

jquery - 如何使用peerDependency解决NPM中的依赖 hell

python - 在 python 中构建依赖关系图

android - OKHTTP 响应 XMLPullParser

android - 我可以在缓存之前以某种方式从 OkHttp 响应中删除 header 吗?

java - Maven项目没有引用java中的sikuli-api依赖

android - OkHttp 4.x 尝试通过调用请求访问 url 时出错

android - 为什么每当我运行 Espresso 测试时都会启动新的 Gradle 构建?

java - 从 Gradle 添加 URL 到 BuildConfig 文件

android - Android Studio Gradle同步无法解决

android - 最后在 gradle 中运行一次任务