Gradle “拆分包”;“okhttp3”;如果添加了okhttp urlconnection依赖项,则生成错误

Gradle “拆分包”;“okhttp3”;如果添加了okhttp urlconnection依赖项,则生成错误,gradle,dependencies,okhttp,java-9,Gradle,Dependencies,Okhttp,Java 9,我正在使用OkHttp3为纯Java应用程序构建一个简单的连接API,我遇到了一个构建问题,它似乎是由Square对多个依赖项工件使用相同的包名这一事实触发的 我以前看过一些讨论Maven依赖关系和Eclipse消息传递的问答,但所有这些都表明,即使Eclipse对带有模块错误的导入进行注释,Maven或Gradle构建仍然有效。在这种情况下,只要我简单地添加一个依赖项并且不做其他更改,Gradle构建就会失败 该应用程序是一个纯Java11模块构建。我正在使用一个最近的Eclipse和Grad

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

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

该应用程序是一个纯Java11模块构建。我正在使用一个最近的Eclipse和Gradle nature作为IDE,但我不认为这是严格相关的。我使用OkHttp3将私有端点转换为API,其中一个端点需要CookieJar。希望只使用默认实现,我将
'com.squareup.okhttp3:okhttpurlconnection:3.14.9'
添加为一个项目中的依赖项,该项目已经将
'com.squareup.okhttp3:okhttp:3.14.9'
作为一个可传递依赖项。这两个类在技术上都提供使用相同包名的类:“okhttp3”

e、 例如,我所做的就是取消对该代码段中的依赖项行的注释,并保存
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 wrapper 5.6.4

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

根据我在别处读到的一些建议,我尝试将
'com.squareup.okhttp3:okhttp'
从包含它的所有依赖项中排除,然后将其单独拉入,但这没有帮助(我并不认为会,但我正在尝试任何HailMary)

解决方法包括简单地将我想要的两个Kotlin类直接放到项目中,然后以这种方式重命名包。这是一种骇人听闻的黑客行为,很可能违反了图书馆许可证。我也可以直接实现我所需要的cookie,但是我很懒(虽然,很明显,我想把精力花在解决这个问题上,而不是用我已有的接口实现cookie类)


我觉得这是Square方面的一个bug,以及他们如何打包这些库/模块。既然他们如此关注Android,也许我是唯一一个想要在Java 9或更高版本上okhttp urlconnection的人?所以,这个问题更多的是看我是否应该把它作为一个缺陷提出,也可能是我忽略了一些显而易见的东西。

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

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

遗憾的是,JPMS有这个约束。我们已经修复了其他一些开源项目,但没有修复这个项目