Wie zu beheben jar Konflikte in der Laufzeit?
Habe ich zwei Gläser sind hin-und hergerissen. Beide enthalten eine Klasse mit dem gleichen Paketnamen und Klassennamen. Aufgrund der gleichen Gründe, die ich nicht entfernen kann entweder von Ihnen.
So, gibt es eine Möglichkeit, dieses Problem zu beheben? Im Idealfall, ich hoffe, es ist ein Weg, können Sie lassen Sie mich entscheiden die Klasse, in die Gläser sollten aufgerufen werden, die während der Laufzeit.
Ich weiß zu schätzen, Hilfe von irgendjemandem.
- Sind Sie mit einem build-system wie maven oder gradle zu verwalten, Abhängigkeiten?
- Leider Nein, meine app ist mit Hilfe von ANT.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ein Paket erstellen Struktur (dieselbe wie die, die in Ihrem in Konflikt stehenden Gläser) in Ihrem Projekt-Ordner mit einem anderen Namen & kopieren Sie den jeweiligen Inhalt von jedem der Gläser. Verwenden Sie ein Paket aus dem Glas und die andere aus dem Projekt (das neue Paket, das Sie gerade erstellt haben)
Ich habe dies getan, sehr vor kurzem, und es hat funktioniert.
Glück!
Ihre Optionen in diesem Fall sind.
1.(Der beste Weg) Ändern app-code zu verwenden neueste version von jar. Wenn Sie Ihr Programm von einem anderen abhängt das Stopfen, das hängt davon ab, die veraltete jar-Datei-check für die neueste version von der das Stopfen.
OSGi-Container
Zwei classloadern. Studieren müssen um ein wenig Theorie und kann manchmal führen zu unerwarteten Fehlern.
Nun bin ich keine Beispiele, da gibt es reichlich Infos und Beispiele in den links unten, um Ihnen helfen,
Java Klassenpfad zum laden von Klassen => Mehrere Versionen des gleichen jar/Projekt
Jar-Hölle: wie wird ein classloader ersetzen einer jar-Bibliothek version mit Laufzeit
http://java.dzone.com/articles/java-classloader-handling
http://javarevisited.blogspot.in/2012/12/how-classloader-works-in-java.html
Alles, was dynamisch miteinander verknüpft werden müssen, um eine Möglichkeit zu haben, zu unterscheiden, was in Verbindung mit zur Laufzeit. Das ist der ganze Punkt, der mit package-Hierarchie, zum aufteilen der code. Sie können um das Problem der identischen Klassennamen, aber sobald die Pakete sind die gleichen ich weiß nicht, von einer Weise zu zwingen, die JVM link gegen eine über die andere.
Können Sie verschiedenen classloadern und führen widersprüchliche Komponenten in unterschiedlichen Sandboxen.
Gibt es keine Möglichkeit, dynamisch wählen Sie, welches Glas zu benutzen, wenn die beiden Gläser auf den classpath, und Sie den system-Mechanismus zum laden von Klassen. Java zum laden von Klassen holt Sie den erste-Klasse-Datei.
Dies ist ein altes Thema, aber es war eine Lösung für JAR-Konflikte, aber es funktioniert nur bis JAVA 8. Sie bewegen könnte, Ihre widersprüchliche Gläser in zwei separate Ordner, und dann erwähnen Sie Sie in der richtigen Reihenfolge in "java.gebilligt.dirs" - Eigenschaft. Dadurch zwingen Sie Ihre app, um pre-load die angenommene Gläser und Ihre Klassen in der angegebenen Reihenfolge, zwingt die gewünschten Klassen, die später verwendet werden, wenn Sie aufgerufen. Ich Tat es für meine app, die lief auf JBoss und hatte 2 Gläser mit genau der gleichen Klasse und Paket. Die Komplexität war, dass ich am Ende die Billigung 23 Gläser anstatt 2, da gab es Abhängigkeiten, aber schließlich ist der workaround funktioniert - wirkliche Problem war behoben. Leider ist die Unterstützung von java.gebilligt.dirs entfernt wurde, ausgehend von Java8. Wenn jemand noch eine Idee, wie das zu tun, ähnlichen trick für das neueste Java, bitte, teilen.