2009-04-29 7 views
1

Wir sind gerade dabei, unsere Anwendung von unserer Produktionsumgebung in ein brandneues Rechenzentrum zu migrieren. JavaEE 5, WAS 6.0 Seltsames Problem mit JSP umfasst

  • Aktuelle Produktionsumgebung: Java 1.4, Java EE 3, 5,1, JSF 2.1
  • New Data Center-Umgebung: Java 1.5, Java EE 5, WAS 6.1, JSF 2.1
Unsere Anwendung auf JSF gebaut 2.1 und enthält den folgenden Code in einem der AJAX-Anrufe:
request.getSession().getServletContext().getRequestDispatcher(
        "/results.faces").include(request, response);
Und das ist, wo wir auf Probleme stoßen.

Fall 1: EAR-Struktur gemäß den Standardspezifikationen
. EAR -> WAR -> WEB-INF -> lib -> * .jar (alle anwendungsspezifischen jars sind unter WEB-INF/lib). Dies funktioniert nicht und wir erhalten Ausnahmen für die Klasse, die nicht vom Klassenlader gefunden wird. Außerdem schlägt der obige AJAX-Aufruf fehl (keine Ausgabe generiert)

Fall 2: EAR enthält alle Anwendungs-JAR-Dateien im Stammverzeichnis (MANIFEST.MF hat den Klassenpfad manuell angegeben).
Dieser Ansatz funktioniert einwandfrei und alle JAR-Dateien werden ohne Probleme geladen. Außerdem läuft der AJAX-Anruf auch gut.

Irgendwelche Ideen, warum dies passieren könnte.

- Ashish

Antwort

1

Ja, es ist, weil Java EE Applikationsserver eine Hierarchie der Klassenlade haben, die etwas geht: zuerst die Bootstrap Class Loader genannt wird; Als nächstes folgt der EAR-Level-Klassenlader und dann der WAR-Level-Klassenlader. Loader der höheren Klassen werden nicht nach unten für die Klassen suchen, die sie benötigen. Wenn sie nicht finden, was sie brauchen, wird eine ClassNotFoundException ausgelöst.

Also die JARs in WEB-INF/lib waren nicht für die EAR-Ebene Klassenlader sichtbar. Wenn Sie diese JARs verschieben, lösen Sie das Problem. Es macht all diese JARs für alle WARs in deiner EAR sichtbar.

Eine Sache, die Sie überprüfen sollten, ist die Spezifikation für Ihre web.xml und andere Dateien. Die Servlet- und JSP-Spezifikationen änderten sich irgendwo auf dem Weg, so dass JARs wie JSTL und so von Version 1.0 zu 1.1 gingen. Sie sollten Ihre web.xml und alle JARs sorgfältig überprüfen, um sicherzustellen, dass sie den Spezifikationen entsprechen, die von Ihrem Java EE-Anwendungsserver unterstützt werden.

Leider ist das Aktualisieren des Anwendungsservers nicht so einfach wie das Einsetzen eines EAR oder WAR.