2016-07-05 14 views
0

Ich arbeite mit zwei verschiedenen Versionen einer bestimmten Bibliothek. Wenn der Benutzer ein Objekt auswählt, werde ich die Version der Bibliothek erkennen, die dieses Objekt erstellt hat. Jetzt muss ich Code ausführen, der dieser Version entspricht.Laden und entladen Sie verschiedene Version von jar zur Laufzeit

Das Problem ist, dass Code in beiden Bibliotheksversionen redundant ist, jede Version nur gültig für die Objekte, die mit dieser Version erstellt wurden. Ich denke, die Folge davon ist, dass ich folgendes zur Laufzeit tun:

  • Unload die Gläser, die nicht
  • Legen Sie die Gläser benötigt werden, die benötigt werden.

Ist das mit dem URLClassLoader möglich? Irgendwie so?

File dirVersion3= new File("lib/dirVersion3"); 
File dirVersion4= new File("lib/dirVersion4"); 
URL[] url={dirVersion4.toURL()}; 

ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader(); 
URLClassLoader loader = new URLClassLoader(url, currentThreadClassLoader); 
Thread.currentThread().setContextClassLoader(loader); 
+0

ist dies eine eigenständige Java-Klasse oder ein Teil eines Dienstprogramms auf einem App-Server bereitgestellt? – Sampada

+0

Wenn Sie für jede Bibliothek einen neuen Klassenlader erstellen, können Sie beide Versionen gleichzeitig zur Verfügung stellen. Wenn Sie die gleiche Klasse mit zwei verschiedenen (Peer-) Klassenladern laden, werden Sie feststellen, dass ein von CL1 geladenes 'ClassA' nicht das gleiche wie' ClassA' ist, das von CL2 geladen wird, da das CL Teil des geladenen Klassenobjekts ist! Sie können den allgemeinen Code in eine Bibliothek umstrukturieren, die von beiden JAR-Versionen verwendet wird. Laden Sie das allgemeine JAR mit einem gemeinsamen CL oder der App CL, und verwenden Sie dieses CL als übergeordnetes Element für den versionsspezifischen CL. –

Antwort

0

Ich glaube, Sie haben 2 Möglichkeiten:

  1. Repackage eine Version der Bibliothek mit Jarjar (https://github.com/shevek/jarjar), so wird es verschiedene Paketnamen. Auf diese Weise können Sie beide Versionen gleichzeitig im selben ClassLoader laden.
  2. erstellen 2 Classloader die Last einer Bibliothek Version je und viele Delegation und Reflexion Code schreiben
Verwandte Themen