2017-11-10 69 views
10

Mam następującą sytuację:Dwie biblioteki wprowadzają różne wersje tej samej zależności. Jak je zaimportować?

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

Teraz dostaję VerifyError ponieważ TreatsLibrary korzysta IceCream.giveToKidAfterDrill() który został usunięty w wersji 2.0 ze względów prawnych.

W jaki sposób mogę zaimportować obie wersje i upewnić się, że każda z nich używa własnych?

+2

Nie można tego zrobić, używając tylko jednego ClassLoadera, jak w jednej ClassLoader, może istnieć tylko jedna wersja klasy. Możesz chcieć rzucić okiem na OSGi, jeśli nie chcesz zaimplementować własnego mechanizmu ładowania klas. –

+0

Tak, można to zrobić, po prostu nie pamiętam, jak to miało związek z przemianowaniem bibliotek. – gurghet

+0

Oznaczyłeś to za pomocą polecenia sbt-assembly, które pomoże ci tylko, jeśli spakujesz swoje biblioteki za pomocą pliku JAR. –

Odpowiedz

4

Ta odpowiedź zakłada, że ​​mówisz o tym, jak załadować te biblioteki z pliku JAR w pakiecie w środowisku wykonawczym.

Należy zacieniać zależności za pomocą sbt-assembly. Można to zrobić w następujący sposób:

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

Ta wola odcień zależność IceCream w com.library.treats i zmienić każdą nazwę pakietu na początek my_icecream.

+0

Nie są one używane w projekcie tylko w zależnościach. – gurghet

+0

@gurghet Nie jestem pewien, co to ma wspólnego z moją odpowiedzią. To będzie zacieniało każdą zależność, niezależnie od tego, czy jest napisane przez ciebie, czy też spakowane przez osobę trzecią. –

+0

Co robi inproject? – gurghet