2017-11-10 251 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

相關問題