2009-06-04 2 views
7

Ich traf auf diesem fiesen Verhalten auf JBoss 4.2 in QA, und ich möchte es im Keim ersticken, bevor wir in Produktion gehen und eine andere Ecke Fall finden.Wie können Sie die Neukompilierung von Jsps in JBoss 4.2 erzwingen?

A jsp Calles ein Verfahren, das die folgende Signatur hatte:

public void methodName(String arg) 

Dies wurde geändert:

public void methodName(String arg, Object... args) 

Eine bereits bestehende JSP diese Methode via genannt:

methodName("param"); 

Bei der Implementierung des modifizierten Codes hat JBoss die JSP nicht neu kompiliert, was zu einem Absturz in der QA führte. Das Hinzufügen eines dummen Kommentars zum JSP behob das Problem (JBoss erkannte, dass die JSP es änderte und neu kompilierte).

Gibt es eine Einstellung auf JBoss Neuübersetzung von JSPs beim Neustart zu erzwingen?

EDIT: Um einige Punkte in der Antwort zu klären, ist das Setup, dass die JSPs Teil eines Krieges sind, der Teil eines Ohres ist. Das Ohr hat alle Klassen in einem Glas.

In Bezug auf den Wunsch, vorkompilieren, wenn das System nicht denkt, dass die JSP kompiliert werden muss, kompiliert Force-Compilierung vorkompilieren? Es scheint nicht so. Der Fehler ist hier kein Komplikationsfehler, es ist ein Methodenaufruffehler wegen der "geänderten" (auf der Bytecodeebene, nicht wirklich auf der Codeebene) Methodensignatur.

Nachtrag: Beachten Sie, dass wir in der Produktion in letzter Zeit erfahren haben, dass selbst mit der akzeptierten Antwortflagge die JSPs nicht neu kompiliert wurden, obwohl sich die JSP tatsächlich änderte. Major Bug dort, aber egal, JBoss wurde normal heruntergefahren. An diesem Punkt wird es eine alte Version von JBoss, aber wenn Sie es immer noch benutzen, ist das Löschen des Inhalts der Verzeichnisse work und tmp der einzige Weg, um sicher zu sein.

Ich ändere nicht die angenommene Antwort, einfach weil es wirklich zu dem Punkt kommt, wonach die Frage gesucht hat. JBoss Bugs sind ein separates Problem.

Antwort

11

auch Wenn der JSPs Teil eines Krieges sind, die Teil einer EAR ist, die als ein Glas eingesetzt wird, dann werden ich bin mir nicht klar, warum Ihr JSPs nicht neu kompiliert werden. Verfügen die JSPs in der WAR-Datei nicht über neuere Zeitstempel als ihre JBoss-kompilierten Klassendateien aus der letzten Bereitstellung? Wenn nicht, könnten Sie die JSPs nicht als Teil des WAR/EAR-Builds vor der Bereitstellung anfassen. [Ich beziehe mich darauf, den Unix- "Touch" -Befehl zu verwenden, nicht jede JSP-Datei manuell zu berühren.]

Alternativ kann die DeleteWorkDirOnContextDestroy-Einstellung in $ JBOSS/server/default/deploy/jboss-web.deployer/META-INF Möglicherweise ist /jboss-service.xml das, wonach Sie suchen. Es ist standardmäßig falsch, aber Sie können es auf True setzen. Ich denke, dies sollte die Klassendateien der JSPs bei der erneuten Bereitstellung löschen, damit sie beim ersten Zugriff auf jede JSP neu erstellt werden.

Weitere Informationen finden Sie unter https://jira.jboss.org/jira/browse/JBAS-3358.

+1

Großartig! Ich überprüfe, ob es funktioniert und ob es die Antwort akzeptiert. – Yishai

+5

+1 Danke! Nur um in JBoss 5.1.0GA zu erwähnen, ist die entsprechende Datei $ JBOSS/server/default/deplyers/jbossweb.deployer/META-INF/war-deployer-jboss-beans.xml –

+1

Danke, dies löste ein Problem, das ich mit JSP-Änderungen hatte wurde nach einer Bereitstellung nicht angezeigt. –

1

Ich kenne keine Einstellung, aber das Löschen der generierten Java-Klassendatei im Arbeitsverzeichnis Ihrer JBoss-Instanz bewirkt, dass die JSP beim nächsten Aufruf neu kompiliert wird.

+1

Danke, aber das wäre praktisch während der Produktion Bereitstellung schwer zu tun. – Yishai

1

Sie können die JBoss-Startskripte ändern, um explizit die Verzeichnisse "tmp" und/oder "work" zu löschen, in denen die kompilierten JSPs gespeichert sind. JBoss hätte dann keine andere Wahl als sie alle neu zu kompilieren.

nicht subtil, aber es würde die Arbeit machen.

0

Eine Option wäre für Sie alle Ihre jsp die bei der Erstellung vorzukompilieren. Dies würde schnell zu Kompilierungsfehlern führen.

Sie könnten dies auch in der Produktion tun - Beschleunigung des ersten Zugriffs, aber ich habe das Gefühl, Sie wollen dies mehr für einen QA-Schritt als alles andere. Wenn dies der Fall ist, können Sie den Vorkompilierungsschritt zu Ihrer Testphase in Ihrem Build-Tool Ihrer Wahl hinzufügen - und damit auch in Ihre CI-Umgebung. Dies würde gewährleisten, dass JSPs, die nicht kompilieren, es nicht aus dem Test bringen.

Sehen Sie diese Einzelheiten über eine precompile Aufgabe ausgeführt wird:

Jboss Jasper configuration

Hoffnung, das hilft.

+0

Danke, das machen wir eigentlich. Das Problem ist, dass das Build-Skript sauber ist, und in einer sauberen Kompilierung ist das Beispiel in Ordnung. Das Problem hierbei ist, dass die zugrunde liegende JSP neu kompiliert werden musste, um zu funktionieren, obwohl sie sich nicht änderte, und die Neukompilierung würde funktionieren, aber die JSP funktioniert nicht ohne Neukompilierung. – Yishai

+0

Fair genug, es wird diesen Fehler beim Build nicht finden. Haben Sie in Erwägung gezogen, die Produktion vorzufixieren? – Pablojim

+0

Wie wird die Produktion vorkompiliert (welche Einstellung verwenden Sie)?Wird es alles neu kompilieren? – Yishai

0

Einige JSP-Container (gemäß Abschnitt 8.4.2 der Spezifikation JSP 1.2) unterstützen die Vorkompilierung einer JSP-Seite.

Um eine JSP-Seite, rufen Sie die Seite mit einer Abfragezeichenfolge von

http://hostname.com/mywebapp/mypage.jsp?jsp_precompile 

Die JSP-Seite wird nicht ausgeführt. Vorkompilieren? Jsp_precompile Wenn der Container die Vorkompilierung unterstützt, wird die JSP-Seite bei Bedarf kompiliert.

Siehe http://www.rgagnon.com/javadetails/java-0414.html

0

Pablojim ist auf dem richtigen Weg. Sie brauchen nur ein paar mehr Informationen, um einen Überblick über das zu bekommen, was vor sich geht. Hier ist, wie ich es verstehe.

In prod haben Sie ein JSP geändert, das die Neukompilierung anderer Jsps erfordert. Damit sie neu kompiliert werden können, muss eines von zwei Dingen passieren.

  1. Die kompilierte Version des JSP muss gelöscht werden.
  2. Die jsp braucht selbst (oder auch wenn es „berührt“ - Änderungsdatum aktualisiert wird) geändert werden

Wenn Sie noch überprüfen müssen, dass alle Ihre jsps arbeiten, werden sie alle precompiled using an ant task sein müssen. Dies ermöglicht Ihnen auch, die WAR-Datei mit den vorkompilierten JSPs in der WAR-Datei zu implementieren. Dies sollte dein Problem lösen.

Wenn Ihre Dateien nicht in einer WAR-Datei, sondern in einem explodierten Format bereitgestellt werden, sollten Sie seriously consider packaging your web app in einer WAR-Datei für die Bereitstellung verwenden. Dies macht es zu einem schönen Paket für die Bereitstellung zwischen Umgebungen.

+0

Es wird in einem Krieg eingesetzt, und ich überprüfe es mit der Vorkompilierung, aber die Ergebnisse der Vorkompilierung werden einfach weggeworfen, so dass JBoss seine eigenen Entscheidungen über die Neukompilierung trifft und in diesem Fall nicht aggressiv genug ist. – Yishai

Verwandte Themen