2017-11-10 4 views
10

Ich habe folgende Situation:Zwei Bibliotheken bringen unterschiedliche Versionen derselben Abhängigkeit. Wie importiert man beide?

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

Jetzt bekomme ich eine VerifyError weil TreatsLibrary ist IceCream.giveToKidAfterDrill() verwendet, die in der Version 2.0 aus rechtlichen Gründen entfernt wurde.

Wie importiere ich beide Versionen und stelle sicher, dass jedes seine eigenen verwendet?

+2

Dies kann nicht mit nur einem ClassLoader durchgeführt werden, da in einem ClassLoader nur eine Version der Klasse existieren kann. Sie können sich OSGi ansehen, wenn Sie nicht Ihren eigenen Mechanismus zum Laden von Klassen implementieren möchten. –

+0

Ja, es kann gemacht werden, ich erinnere mich einfach nicht, wie es mit dem Umbenennen von Bibliotheken zu tun hatte – gurghet

+0

Sie haben dies mit sbt-Assembly getaggt, was Ihnen nur hilft, wenn Sie Ihre Bibliotheken mit einem Uber JAR packen. –

Antwort

4

In dieser Antwort wird davon ausgegangen, dass Sie darüber sprechen, wie Sie diese Bibliotheken zur Laufzeit aus einem über JAR gepackten Paket laden können.

Sie müssen Ihre Abhängigkeiten mit sbt-assembly schattieren. Dies kann getan werden, wie folgt:

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

Dies wird Schatten der IceCream Abhängigkeit in Ihrem com.library.treats und jeden Paketnamen mit my_icecream beginnen zu ändern.

+0

Nein, sie werden nicht im Projekt nur in Abhängigkeiten verwendet – gurghet

+0

@Gurghet Nicht sicher, was das mit meiner Antwort zu tun hat. Dies wird jede Abhängigkeit überschatten, unabhängig davon, ob es von Ihnen geschrieben oder von einem Dritten verpackt wurde. –

+0

Was macht ein Projekt? – gurghet

Verwandte Themen