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 应用程序

手机没有安装相同包名的应用,怎么会发生包名冲突呢?

MySql:在联结表中选择具有相同依赖项的条目

具有相同依赖项的不同版本的 nuget 包的 azure 函数

Gradle 设置以处理具有相同代码库但依赖项不同的两种部署类型

如何附加多个具有相同变量名的 .mat 文件?