Frage

Ich schlug auf dieser 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.

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

 public void methodName(String arg)

Dies wurde folgendermaßen geändert:

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

Eine bereits bestehende JSP nannte diese Methode über:

 methodName("param");

Bei Einsatz der modifizierten Codes, JBoss nicht die JSP neu kompilieren und dies zu einem Absturz in QA verursacht. Hinzufügen eines dummen Kommentar zu dem jsp das Problem behoben (JBoss erkannt, dass die JSP verändert und neu kompiliert es).

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

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

In Bezug auf den Wunsch vorab zusammenstellen, wenn das System nicht denken, dass die JSP-Kompilierung benötigt, wird Kraft Neuübersetzung vorab zusammenstellen? Es scheint nicht so. Der Fehler ist hier kein compliation Fehler, ist es ein Methodenaufruf Fehler wegen der „verändert“ (auf Byte-Code-Ebene, nicht wirklich auf Codeebene) Methodensignatur.

Nachtrag: Beachten Sie, dass wir in der Produktion erlebt, dass vor kurzem auch mit der Flagge der akzeptierten Antwort gesetzt der JSPs neu kompilierte nicht, auch wenn die JSP in der Tat verändert haben. Wesentliche Fehler gibt, aber egal, JBoss war Shutdown normal. An diesem Punkt wird es immer eine alte Version von JBoss zu sein, aber wenn Sie es immer noch verwenden, löschen den Inhalt der Arbeit und tmp ist der einzige Weg, um sicher zu sein.

Ich ändere nicht die akzeptierte Antwort, nur weil es auf den Punkt der wirklich bekommt, was die Frage suchte. JBoss Bugs sind irgendwie ein anderes Thema.

War es hilfreich?

Lösung

Wenn die JSPs Teil eines Krieges sind, die Teil einer EAR ist, die als ein Glas eingesetzt wird, dann bin ich nicht klar, warum Ihre JSPs sind nicht neu kompiliert werden. Ziehen Sie nicht die JSPs in der WAR-Datei haben neuere Zeitstempel als ihre JBoss-kompilierten Klassendateien aus dem letzten deploy? Wenn nicht, Sie berühren als Teil der JSPs konnte nicht für den Bau der WAR / EAR vor der Bereitstellung. [Ich beziehe mich die Unix „touch“ Befehl zu verwenden, nicht manuell jede JSP-Datei zu berühren.]

Alternativ kann die DeleteWorkDirOnContextDestroy Einstellung in $ JBOSS / server / default / deploy / jboss-web.deployer / META-INF / jboss-service.xml kann sein, was Sie suchen. Es ist falsch, standardmäßig, aber es auf true setzen können, was Sie brauchen. Ich denke, das sollte die JSPs' Klassendateien auf redeploy löschen, so dass sie beim ersten Zugriff jeden JSP neu erhalten.

Siehe https://jira.jboss.org/jira/browse/JBAS-3358 für weitere Informationen.

Andere Tipps

Ich weiß nicht, von einer Einstellung, sondern im Arbeitsverzeichnis der JBoss-Instanz die generierte Java-Klassendatei zu löschen wird die JSP veranlassen, das nächste Mal neu kompiliert werden sie aufgerufen wird.

Sie coudl das JBoss-Startskripts ändern explizit die „tmp“ und / oder „Arbeit“ Verzeichnisse zu löschen, wo die kompilierten JSPs gespeichert sind. JBoss würde dann keine andere Wahl, als sie neu zu kompilieren alle.

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

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

Sie können auch diese in der Produktion tun - zuerst Zugang zu beschleunigen, aber ich habe das Gefühl, Sie das mehr als alles andere für einen QA Schritt wollen. Wenn ja, könnten Sie den precompile Schritt zur Ihrer Testphase in Ihrem Build-Tool der Wahl hinzufügen - und so an Ihrer CI-Umgebung. Dies würde Gewähr dafür bieten, dass der jsp, die kompilieren nicht, wird es nicht aus der Prüfung machen.

Sehen Sie diese, um Informationen über eine precompile Aufgabe ausgeführt wird:

Jboss Jasper Konfiguration

Hope, das hilft.

Einige Container JSP (gemäß Abschnitt 8.4.2 der JSP-Spezifikation 1.2) die Fähigkeit von Vorkompilieren eine JSP-Seite unterstützen.

Um vorkompilieren eine JSP-Seite Zugriff auf die Seite mit einem Query-String von? Jsp_precompile

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

Die JSP-Seite wird nicht ausgeführt. Wenn der Behälter Precompilieren unterstützt, wird die JSP-Seite kompiliert werden, wenn nötig.

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

Pablojim ist auf dem richtigen Weg. Sie brauchen nur ein paar mehr Infos einen vollständigen Überblick zu bekommen, was los ist. Hier ist, wie ich es verstehe.

In prod, haben Sie eine jsp geändert, die andere jsps erfordert neu kompiliert werden. Damit sie neu kompiliert eines von 2 Dinge müssen passieren

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

Wenn Sie noch überprüfen müssen, dass alle Ihre jsps arbeiten, werden sie alle brauchen vorkompilierte sein mit einem ant-Task . dies ermöglicht es Ihnen, auch die WAR-Datei mit dem vorkompilierte jsps in der WAR-Datei bereitstellen. Dies sollte Ihr Problem lösen.

Wenn Sie Ihre Dateien in einer WAR-Datei nicht entfaltet, sondern in einem Explosionsformat, sollten Sie ernsthaft in Erwägung zieht Verpackung Ihres Web-App in einer wAR-Datei für die Bereitstellung. Dies macht es ein schönes Paket zwischen den Umgebungen zu implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top