2010-01-07 11 views
8

Ich habe eine alte Web-App in Tomcat 5.0 ausgeführt.Steuern Sie die Klassenpfad-Reihenfolge von Gläsern in WEB-INF/lib auf Tomcat 5?

Diese Web App zwei Gläser in WEB-INF/lib hat, sagen wir mal Foo-2.0.jar und Bar-2.0.jar. Bar-2.0.jar enthält tatsächlich eine Foo-1.0.jar innerhalb davon. Bar ist auch ein totes Projekt, das bedeutet kein Upgrade, keine Quelle, aber immer noch wichtig für die Anwendung. Die neueste Version dieser Anwendung erfordert Foo-2.0.jar für einige andere Sachen. beide Foo-1.0.jar und Foo-2.0.jar im Classpath Having zu einem Konflikt, nämlich eine ClassDefNotFound Art von Fehler, wo eine Klasse, die später in 2.0 hinzugefügt wurde, kann nicht in 1.0 gefunden werden, usw.

in Eclipse die einfache Lösung ist auf der rechten Maustaste auf Ihr Projekt , klicken Sie auf Eigenschaften >Java Built Pfad>Ordnung und Export und Foo-2.0.jar oben Bar- bewegen 2.0.jar so ist es zuerst gelöst.

Wie erreicht man diese Art von Klassenpfad Bestellung für Gläser in WEB-INF/lib in Tomcat?

Antwort

3

Setzen Sie Foo-1.0.jar auf $ CATALINE_HOME/common/indossed (oder an einem anderen Ort, wo es nach Foo-2.0.jar geladen wird).

1

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.

+0

Es gibt keine Möglichkeit zu wissen, ob Bar-2.0 mit Foo-2.0 oder nicht funktioniert, und es ist eine massive, binäre Bibliothek ohne Testfälle. – rcampbell

+0

Ich glaube, die Lösung, die Sie verwenden, hat Bar-2.0 mit Foo-2.0, nur in einer Art Umweg. – jsight

4

Streifen 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 (um die Entwicklungsumgebungen zu täuschen) als auch für die Bereitstellung.

+0

Ich denke wirklich, das ist der beste Vorschlag. Verpacken Sie Ihr bar-2.0.jar, sonst fragen Sie nur nach Kopfschmerzen auf der Straße. –

-2

Dies ist ein bisschen hacky aber könnte funktionieren. Ändern Sie den Namen von Foo-2.0.jar in alphabetischer Reihenfolge vor Bar-2.0.jar, sagen wir AFoo-2.0.jar.

32

Tomcat 5's classloading precedence für Webapps ist in etwa wie folgt: zuerst die Bootstrap/System (JRE/lib, dann Tomcat internen Klassen), dann die Webapp-Bibliotheken (erste WEB-INF/classes, dann WEB-INF/lib), dann die gemeinsamen Bibliotheken (erste Tomcat/common, dann Tomcat/lib) und endlich die webapp-shared libraries (Tomcat/shared).

So Foo-2.0.jarvorBar-2.0.jar geladen zu bekommen, am besten, was Sie tun können, ist Bar-2.0.jarWEB-INF/lib-Tomcat/common oder Tomcat/shared zu bewegen.

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.

+0

Georgy antwortete zuerst, also akzeptierte ich seine Eingabe, aber was Sie beschreiben, ist genau das, was ich getan habe, um das Problem zu lösen. Ihr Link war besonders hilfreich. ** Ich ermutige alle, diese Antwort zu wählen **. – rcampbell

+1

Gern geschehen. Obwohl ich darauf hinweisen möchte, dass die Antworten hier nicht standardmäßig nach dem Antwortdatum geordnet sind. Im Moment des Schreibens können Sie auf der oberen rechten Seite des Benutzers Avatar sehen, dass ich diese Frage vor 23 Minuten und Georgy vor 15 Minuten beantwortet habe. Sie können die Reihenfolge ändern, indem Sie eine der drei Tabs "Älteste", "Neueste" und "Stimmen" rechts oben in den Antworten eingeben. Der Standardwert ist 'votes'. – BalusC

+1

Und im Tooltip können Sie die genaue Zeit sehen. So war ich eigentlich zuerst: o – BalusC

Verwandte Themen