- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
系统详细信息: Arch Linux:4.11.7-1-ARCH x64 Oracle Java JDK:1.8.0_131 IntelliJ Scala 插件:2017.1.19(最新) SBT:0
我是一名优秀的程序员,十分优秀!