Kontrollieren Sie die Klassenpfad-Reihenfolge von Gläsern in WEB-INF / lib auf Tomcat 5?

8

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?

    
rcampbell 07.01.2010, 15:12
quelle

7 Antworten

3

Lege Foo-1.0.jar auf $ CATALINE_HOME / common / indossed (oder irgendeinen anderen Ort, wo es nach Foo-2.0.jar geladen wird).

    
Georgy Bolyuba 07.01.2010, 16:44
quelle
32

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.

    
BalusC 07.01.2010 16:36
quelle
4

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.

    
David Soroko 07.01.2010 16:02
quelle
1

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.

    
jsight 07.01.2010 15:20
quelle
0

Es ist möglich den Klassenpfad im Hauptfest des Glases zu setzen. Ссылка Ich kann nicht wirklich versprechen, dass es das Problem lösen wird, aber es kann einen Versuch wert sein.

    
Kennet 07.01.2010 16:06
quelle
0

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.

    
weberjn 26.03.2018 15:30
quelle
-2

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.

    
Vinodh Ramasubramanian 07.01.2010 16:23
quelle

Tags und Links