如果添加了 okhttp-urlconnection 依赖项,则拆分包 "okhttp3" 会出错
Split package "okhttp3" errors out build if okhttp-urlconnection dependency added
我正在使用 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'
作为传递依赖项引入。这两个在技术上都使用相同的包名称提供 classes:“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 中看到 all "okhttp3" imports:
的注释
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 包装器 5.6.4。
据我所知,所有 OkHttp3 库都设置了足以满足 Java 9+ 的模块信息。 Eclipse 中的模块似乎对此很满意。看起来 Eclipse 或 Gradle 都不像两个不同的依赖项将其 Java 包宣传为“okhttp3”这一事实。在我看来,任何使用 Java 9 或更高版本的 Gradle 或基于 Maven 的项目都会因拆分包依赖关系而失败。
根据我在其他地方读到的一些建议,我尝试从所有包含它的依赖项中排除 'com.squareup.okhttp3:okhttp'
,但此时我正在尝试任何冰雹玛丽)。
解决方法包括一些技巧,例如直接将我想要的两个 Kotlin classes 直接放入项目中,然后以这种方式重命名包。这是一个令人震惊的黑客攻击,可能违反了图书馆许可。我也可以直接实现我需要的cookie东西,但是我很懒(虽然,显然,我想花我的精力解决这个问题,而不是使用我已经拥有的接口实现一个cookieclass)。
我觉得这是 Square 的一个错误以及他们如何打包这些 libraries/modules。由于他们非常关注 Android,也许我是唯一一个想要在 Java 9 或更高版本上使用 okhttp-urlconnection 的人?所以,这个问题更多的是关于我是否应该将其作为缺陷提出来,而且也许我忽略了一些明显的东西。
这是 OkHttp 的问题,我们可以为您解决。请针对此问题打开带有 link 的跟踪错误。
我们会将这两个 类 移动到一个新包中。为了向后兼容,我们还需要将委托实现留在后面。希望工具允许这样做!
可惜JPMS有这个限制。我们已经修复了一些其他开源项目,但没有修复这个项目。
我正在使用 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'
作为传递依赖项引入。这两个在技术上都使用相同的包名称提供 classes:“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 中看到 all "okhttp3" imports:
的注释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 包装器 5.6.4。
据我所知,所有 OkHttp3 库都设置了足以满足 Java 9+ 的模块信息。 Eclipse 中的模块似乎对此很满意。看起来 Eclipse 或 Gradle 都不像两个不同的依赖项将其 Java 包宣传为“okhttp3”这一事实。在我看来,任何使用 Java 9 或更高版本的 Gradle 或基于 Maven 的项目都会因拆分包依赖关系而失败。
根据我在其他地方读到的一些建议,我尝试从所有包含它的依赖项中排除 'com.squareup.okhttp3:okhttp'
,但此时我正在尝试任何冰雹玛丽)。
解决方法包括一些技巧,例如直接将我想要的两个 Kotlin classes 直接放入项目中,然后以这种方式重命名包。这是一个令人震惊的黑客攻击,可能违反了图书馆许可。我也可以直接实现我需要的cookie东西,但是我很懒(虽然,显然,我想花我的精力解决这个问题,而不是使用我已经拥有的接口实现一个cookieclass)。
我觉得这是 Square 的一个错误以及他们如何打包这些 libraries/modules。由于他们非常关注 Android,也许我是唯一一个想要在 Java 9 或更高版本上使用 okhttp-urlconnection 的人?所以,这个问题更多的是关于我是否应该将其作为缺陷提出来,而且也许我忽略了一些明显的东西。
这是 OkHttp 的问题,我们可以为您解决。请针对此问题打开带有 link 的跟踪错误。
我们会将这两个 类 移动到一个新包中。为了向后兼容,我们还需要将委托实现留在后面。希望工具允许这样做!
可惜JPMS有这个限制。我们已经修复了一些其他开源项目,但没有修复这个项目。