Bewältigung von Konflikten auf java-classpath
Ich setze meinen Kontext :
Ich habe zwei Java-Programme, die auf einem einzigartigen Weblogic Server : Programm A und Programm B.
Diese werden gestartet, indem zwei ksh :
programA.ksh und programB.ksh
Beide brauchen C.jar aber in verschiedenen Versionen (aber mit genau der gleichen Paket-und Klassen) :
- Programm Ein muss C-1.0.jar
- Programm B müssen C-2.0.jar
Ich genau, dass beide Programme dieselbe weblogic-classpath.
So, mein classpath enthält in dieser Reihenfolge :
.....
C-1.0.jar
C-2.0.jar
.....
Wie kann ich tun, dass jedes Programm findet seine gute Bibliothek ?
Zum Beispiel, mit meiner aktuellen Konfiguration, Programm B, so wird immer C-1.0.jar statt C-2.0.jar aufgrund der vorrangigen position auf dem classpath.
- Es gibt etwas falsch mit Ihrer Terminologie. Prozesse, die nicht "laufen auf der JVM" ist Die JVM eine (Einzel -) Prozess. Redest du von threads?
- Ja, du hast Recht, in der Tat ist es zwei java-Launcher verpackt in einem shell-Skript. Ich wieder Bearbeiten die post mit der Korrektur
- Ihre Frage ist noch nicht wirklich klar. Wenn Sie starten von java-zweimal (eine für a und Eine für B), dann A-und B-laufen nicht auf der gleichen VM. Jedes Programm hat seine eigenen VM. Ist es das, was du tust?
- Ich habe das gerade korrigiert meine Frage
- Es ist immer noch unklar. Haben Sie eine weblogic-server laufen, oder zwei? Welche Art von Programmen sind A und B? Web-apps bereitgestellt, wie war-Dateien? Ohren? Eine enterprise-Anwendung, Gläser sollten NICHT in der server-classpath. Sie sollten in den Krieg oder Ohr der Anwendung. App-Server bereitstellen können zwei apps mit widersprüchlichen Gläser, wenn diese Gläser sind eingesetzt als Teil der app.
- In der Tat, es gibt zwei KSH, die das starten von Java-Programmen. Aber beide teilen die gleichen weblogic-classpath.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie starten zwei separate Instanzen der JVM für die beiden Programme, , dann verwenden Sie nicht den gleichen classpath! Ist das nicht offensichtlich?
Sind Sie vielleicht mit der CLASSPATH-Umgebungsvariable? Das ist eine sehr alte, veraltete Methode, und Sie sollten es nicht tun. verwenden Sie den-classpath Befehl Linie parameter, so können Sie problemlos verschiedene klassenpfade für die beiden Programme.
Alte Antwort:
Unter der Annahme, dass du redest threads statt Prozessen:
Die beste Lösung wäre fix A, B oder C, so dass A und B können die gleiche version von C.
Oder, wenn die beiden Versionen des C tatsächlich absichtlich anders Verhalten, verwenden Sie eine andere Paket-oder Klassennamen für Sie.
Nur, wenn Sie nicht ändern können A, B oder C sollten Sie die technische Lösung schreiben Sie ein wrapper, der verwendet verschiedenen classloadern für A und B, so dass Sie werden sehen, verschiedene Versionen von C.
Grundsätzlich, wenn Sie dies nicht tun (einfach). Werfen Sie einen Blick auf http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell, wo Sie erklären, dass die standard-Java-classloader nicht.
Können Sie entweder laufen die beiden Prozesse auf verschiedenen VMs, oder gehen Sie in eine Menge von classloader-Hölle...
Stellen Sie sicher, dass nur eine Bibliothek ist vorhanden, auf classpath.
Einfachste Weg ist das erstellen von 2 lib-Verzeichnisse mit korrekten Abhängigkeiten und Referenz-alle Gläser von dort aus in Ihre startup-Skript für den jeweiligen Prozess.
Dieser einfachen shell-Skript, wird dies automatisch für Sie tun:
Ich würde davon ausgehen, dass diese Java-web-apps wenn Sie ausgeführt werden, auf dem WebLogic, Sie sollten in war-Dateien. Es wird keine Kollision, wenn jeder legt man Ihren jeweiligen JAR-Versionen im WEB-INF/lib Ihrer war-Datei.