Ich habe eine alte Web-App in Tomcat 5.0 laufen.
Diese Web-App enthält zwei Dateien in WEB-INF / lib , sagen wir Foo-2.0.jar und Bar-2.0.jar . Bar-2.0.jar enthält tatsächlich ein Foo-1.0.jar darin. Bar ist auch ein totes Projekt, das bedeutet keine Aktualisierung, keine Quelle, aber immer noch wichtig für die Anwendung.
Die neueste Version dieser Anwendung benötigt Foo-2.0.jar für andere Dinge. Wenn sowohl Foo-1.0.jar als auch Foo-2.0.jar im Klassenpfad verwendet werden, entsteht ein Konflikt, insbesondere ein ClassDefNotFound Fehler, wobei a Klasse, die später in 2.0 hinzugefügt wurde, kann nicht in 1.0 usw. gefunden werden.
In Eclipse besteht die einfache Lösung darin, mit der rechten Maustaste auf Ihr Projekt zu klicken, auf Eigenschaften & gt; Java erstellter Pfad & gt; Ordnen und exportieren und verschieben Foo-2.0.jar über Bar-2.0.jar , damit es zuerst aufgelöst wird.
Wie erreicht man diese Art der Klassenpfad-Sortierung für jars in WEB-INF / lib in Tomcat?
Lege Foo-1.0.jar auf $ CATALINE_HOME / common / indossed (oder irgendeinen anderen Ort, wo es nach Foo-2.0.jar geladen wird).
Tomcat 5's classloading precedence für Webapps ist grob wie folgt: zuerst die bootstrap / system ( JRE/lib
, dann Tomcat's interne Klassen), dann die Webapp-Bibliotheken (zuerst WEB-INF/classes
, dann WEB-INF/lib
), dann die allgemeinen Bibliotheken (zuerst Tomcat/common
, dann Tomcat/lib
) und schließlich die Webapplikationen Gemeinsame Bibliotheken ( Tomcat/shared
).
Um also Foo-2.0.jar
loaded vor Bar-2.0.jar
zu bekommen, können Sie Bar-2.0.jar
von WEB-INF/lib
in Tomcat/common
oder Tomcat/shared
verschieben.
Die JARs werden nicht in alphabetischer Reihenfolge ihres Namens geladen. Zumindest gibt es keine Spezifikation, die das sagt. Sie umzubenennen, um die alphabetische Reihenfolge der Dateinamen zu ändern, macht keinen Sinn.
Entfernen Sie Foo-1.0.jar aus Bar-2.0.jar . So wie es ist, ist es nur ein Problem, darauf zu warten, sowohl für die Entwicklung (muss die Dev-Umgebungen zu täuschen) als auch für die Bereitstellung.
Das tun Sie nicht, da diese Funktion in Tomcat nicht verfügbar ist. Wenn sowohl Foo-1.0.jar als auch Foo-2.0.jar gleichzeitig im Klassenpfad benötigt werden, benötigen Sie einige wichtige Klassenpfadreorganisationen.
Wenn Bar-2.0 mit Foo-2.0 arbeiten kann, wäre es das Beste, Bar-2.0 selbst ohne ein Foo-1.0.jar darin neu aufzubauen.
Um Foo-2.0.jar vor Bar-2.0.jar zu haben, aktualisieren Sie die Bar-2.0.jar mit dem Inhalt von Foo-2.0.jar (überschreiben Sie bereits enthaltene .class) und löschen Sie Foo-2.0.jar aus dem Krieg .
-cp A.jar: B.jar hat den Effekt, dass der Inhalt von A.jar wie eine Ebene über B.jar ist. So erhalten Sie den gleichen Effekt, wenn Sie den Inhalt von B.jar mit A.jars überschreiben.
Dies ist ein bisschen hacky, könnte aber funktionieren. Ändern Sie den Namen von Foo-2.0.jar in alphabetischer Reihenfolge vor Bar-2.0.jar, sagen Sie AFoo-2.0.jar.