【问题标题】:Two libraries bring in different version of the same dependency. How to import them both?两个库引入了相同依赖项的不同版本。如何同时导入它们?
【发布时间】:2018-04-24 05:32:14
【问题描述】:

我有以下情况:

+ DentistApp
   L TreatsLibrary
     L IceCream 1.0
   L CavityCausesLib
     L IceCream 2.0

现在我得到一个VerifyError,因为TreatsLibrary 使用的是IceCream.giveToKidAfterDrill(),由于法律原因,它在2.0 版中被删除。

如何导入这两个版本并确保每个版本都使用自己的版本?

【问题讨论】:

  • 这不能像在一个ClassLoader中那样只使用一个ClassLoader来完成,只能存在一个版本的类。如果你不想实现自己的类加载机制,你可能想看看 OSGi。
  • 是的,可以,我只是不记得怎么做了,它与重命名库有关
  • 你用 sbt-assembly 标记了这个,它只会在你使用 uber JAR 打包你的库时帮助你。
  • 我正在使用 Uber 罐子
  • “不,它们仅在依赖项中未在项目中使用” 这与我回答的内容有什么关系?打包 uber JAR 时会发生阴影,并且在运行时这些类将具有不同的包名称

标签: scala dependencies sbt sbt-assembly


【解决方案1】:

此答案假设您正在讨论如何在运行时从打包的 uber JAR 加载这些库。

您需要使用 sbt-assembly 遮蔽您的依赖项。 这可以按如下方式完成:

assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("IceCream.**" -> "my_icecream.@1")
    .inLibrary("com.library.treats" % "TreatsLibrary" % "1.0.0")
    .inProject
)

这将遮蔽com.library.treats 中的IceCream 依赖项,并将每个包名称更改为以my_icecream 开头。

【讨论】:

  • 不,它们仅在依赖项中未在项目中使用
  • @gurghet 不确定这与我的回答有什么关系。这将遮蔽任何依赖项,无论它是由您编写还是由第三方打包。
  • inproject 是做什么的?
  • @gurghet 检查项目中的所有库依赖项。即,如果它引用了com.library.treats.TreatsLibrary,现在需要将其更改为my_icecream.TreatsLibrary
  • 来自自述文件:call .inProject to match your project source 所以不,它没有用
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 2012-05-08
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多