Scala混合具有相同包名的依赖项
Posted
技术标签:
【中文标题】Scala混合具有相同包名的依赖项【英文标题】:Scala mixing dependencies with same package name 【发布时间】:2021-11-21 05:40:56 【问题描述】:问题:
我在 Scala sbt 项目中有 2 个依赖项 - org.slf4j:slf4j-api
(直接,但也用于其他直接依赖项)和 org.fusesource.hawtjni:hawtjni-generator
(传递)。他们都有org.slf4j.helpers.MessageFormatter
这个类。当第三个依赖项尝试调用 MessageFormatter.someFunction(x)
(应该从 slf4j-api
调用,而不是从 hawtjni-generator
调用)时,就会出现问题。
我尝试过的:
清理 IDE (Intellij) 文件,因为我认为这可能是 IDE 无法正确识别它们。没用... 将hawtjni-generator
的排除规则添加到所有其他依赖项,使用它的依赖项除外。没用...
编辑: 项目的简化依赖树如下所示:
[info] +-org.slf4j:slf4j-api:1.7.25
[info] +-ch.qos.logback:logback-classic:1.2.3
[info] | +-org.slf4j:slf4j-api:1.7.25
[info] |
[info] +-com.ltonetwork:leveldbjni.leveldbjni-osx:99-master-SNAPSHOT
[info] | +-org.fusesource.hawtjni:hawtjni-maven-plugin:1.18
[info] | +-org.fusesource.hawtjni:hawtjni-generator:1.18
问题在于logback-classic
(这是第三个依赖项)错误地调用了hawtjni-generator
,而不是slf4j-api
。
【问题讨论】:
你可能需要遮蔽 hawtjni 的 slf4j 依赖。 @LuisMiguelMejíaSuárez 感谢您的回复,我已尝试:ShadeRule.rename("org.slf4j.**" -> "shadedslf4j.@1").inLibrary("org.fusesource.hawtjni" % "hawtjni-generator" % "1.18").inProject
但没有帮助。我相信在 hawtjni 有 slf4j 作为它自己的依赖的情况下,阴影是 hawtjni 自己的包被命名为 org.slf4j。
【参考方案1】:
您是否尝试为您的一个导入使用别名?
import org.fusesource.hawtjni:hawtjni-generator
import org.slf4j.helpers.MessageFormatter => MessageFormatterSlf4j
MessageFormatterSlf4j.someFunctions(x)
MessageFormatter.someFunctions(x) // from fusesource
Scala import alias
【讨论】:
嗯,如果我理解正确的话,这个问题应该在我拥有的第三个依赖项 (logback-classic
) 中完成。理想情况下,我正在寻找不需要分叉而只更改导入的解决方案。以上是关于Scala混合具有相同包名的依赖项的主要内容,如果未能解决你的问题,请参考以下文章
如何在不重构的情况下发布两个具有相同源代码但不同包名的 android 应用程序
具有相同依赖项的不同版本的 nuget 包的 azure 函数