2017-11-10 272 views
10

我有以下情况:两个库引入了不同版本的相同依赖关系。如何导入它们两个?

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

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

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

+2

这不能通过在一个ClassLoader中使用一个ClassLoader来完成,只能存在该类的一个版本。 如果你不想实现自己的类加载机制,你可能想看看OSGi。 –

+0

是的,它可以完成,我只是不记得如何,它与重命名库有关 – gurghet

+0

你用sbt-assembly标记了这个,它只会帮助你,如果你使用超级JAR打包你的库。 –

回答

4

这个答案假定您正在讨论如何在运行时从打包的超级JAR中加载这些库。

您需要使用sbt-assembly来降低您的依赖关系。 这是可以做到如下:

assemblyShadeRules in assembly ++= Seq(
    ShadeRule.rename("IceCream.**" -> "[email protected]") 
    .inLibrary("com.library.treats" % "TreatsLibrary" % "1.0.0") 
    .inProject 
) 

这将遮阳IceCream依赖于你的com.library.treats,并切换到开始my_icecream每包名。

+0

不,他们没有在项目中只用于依赖 – gurghet

+0

@gurghet不知道这与我的答案有什么关系。这将影响任何依赖性,无论它是由您编写还是由第三方打包。 –

+0

inproject做什么? – gurghet

相关问题