2016-05-17 14 views
6

Ich versuche eine Möglichkeit zu finden, 2 verschiedene Versionen einer API in meiner Codebasis zu unterstützen. Sie haben die gleichen Paketnamen, arbeiten aber unter der Haube sehr unterschiedlich (zwei völlig unterschiedliche Systeme). Wie kann ich das machen?Unterstützung von 2 Versionen einer API in Java

Diese beiden APIs haben auch eine Abhängigkeit von Bouncy Castle, aber sie verwenden verschiedene Versionen davon. Wie berücksichtige ich dies auch?

+2

Sie könnten ein Tool verwenden, um die Pakete umzubenennen, sogar in eingebauten Gläsern, oder Sie könnten etwas wie OSGi verwenden (das Umbenennen der Pakete ist viel einfacher) –

+0

Wie planen Sie, diese Bibliotheken in Ihrem eigenen Code zu verwenden? 2 verschiedene Versionen bedeuten 2 verschiedene Methoden Signaturen (zum Beispiel) ... du MUSST 2 verschiedene Versionen deiner Anwendung machen ... ich sehe hier keine andere Wahl ... – Pras

+1

@PeterLawrey Welche Werkzeuge hast du benutzt oder getan weißt du? Ich habe gerade einen gefunden, der "Jar Jar Links" genannt wird. – Rob

Antwort

1

Die Lösung, mit der ich beginnen würde, ist ... Laden der API in einen benutzerdefinierten Klassenlader, der zuerst die untergeordnete Klasse über die übergeordnete Klasse lädt. Wenn Sie Bouncy Castle innerhalb der API kompilieren, müssen Sie sich nicht darum kümmern, es separat zu laden. Wenn Sie das Bouncy Castle-Jar während der Laufzeit dynamisch laden, fügen Sie im Ladeprogramm für benutzerdefinierte Klassen Bouncy Castle und Ihre API diesem Klassenlader hinzu. Verwenden Sie URLClassLoader und sehen Sie meinen Link unten für Eltern zuletzt geladen.

How do I create a parent-last/child-first ClassLoader in Java, or How to override an old Xerces version that was already loaded in the parent CL?

0

Sie können einen benutzerdefinierten Klassenlader erstellen, um die entsprechenden Klassen basierend auf der Logik zu laden, die zum Laden einer Version der API im Vergleich zur anderen erforderlich ist.

2

Ich würde nicht empfehlen, es sei denn, Sie wissen, was Sie tun, aber man könnte eine URLClassLoader wie folgt verwenden:

URLClassLoader classLoaderA = URLClassLoader.newInstance(new URL[] {new URL("versionA.jar")}); 
URLClassLoader classLoaderB = URLClassLoader.newInstance(new URL[] {new URL("versionB.jar")}); 

die Klasse Last:

classLoaderA.loadClass("SomeClass"); 

Another Option ist ein Blick auf OSGI.

+0

Dies berücksichtigt nicht seine Hauptprobleme beim Laden von separaten Versionen von Bouncy Castle sowie mehrerer Versionen der gleichen Klassen von seiner API. Ihre Methode wird immer noch als Erstes geladen und wenn sie nicht korrekt programmiert wird, hat sie Auswirkungen auf ClassNotFound. – Underbalanced