首页 > 解决方案 > 如果添加了 okhttp-urlconnection 依赖项,则拆分包“okhttp3”会出错

问题描述

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

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

该应用程序是一个纯 Java 11 模块构建。我正在使用具有 Gradle 特性的最新 Eclipse 作为 IDE,但我认为这并不严格相关。我正在使用 OkHttp3 将私有端点转换为 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”导入的注释:

okhttp3 包可以从多个模块访问: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 包装器 5.6.4。

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

根据我在其他地方读到的一些建议,我尝试'com.squareup.okhttp3:okhttp'从所有包含它的依赖项中排除,然后将其单独拉入,但这没有帮助(不是我认为会,但我正在尝试任何冰雹玛丽在此刻)。

解决方法包括简单地将我想要的两个 Kotlin 类直接放入项目中并以这种方式重命名包的技巧。这是一个令人震惊的黑客行为,并且可能与库许可证相反。我也可以直接实现我需要的 cookie 东西,但是我很懒(虽然,显然,我想把精力花在解决这个问题上,而不是使用我已经拥有的接口来实现 cookie 类)。

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

标签: gradledependenciesokhttpjava-9

解决方案


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

我们将把这两个类移到一个新包中。为了向后兼容,我们还需要放弃委托实现。希望工具允许这样做!

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


推荐阅读