2009-06-04 59 views
7

我在QA中對JBoss 4.2上的這種討厭的行爲感到懊惱,並且在我們投入生產並找到其他一些角落案例之前,我想將它扼殺在萌芽狀態。如何強制在JBoss 4.2中重新編譯jsps?

一個jsp卡列斯其具有以下特徵的方法:

public void methodName(String arg) 

這變爲:

methodName("param"); 

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

A-預先存在的JSP通過調用此方法

在部署修改後的代碼時,JBoss沒有重新編譯JSP,導致QA崩潰。給jsp添加一個愚蠢的評論解決了這個問題(JBoss認識到JSP改變並重新編譯了它)。

在JBoss上有一個強制重新編譯JSP的設置嗎?

編輯:爲了澄清答案中的一些觀點,設置是JSP是屬於耳朵的一部分的戰爭的一部分。耳朵裏有所有的類,放在一個罐子裏。

關於預編譯的願望,如果系統不認爲jsp需要編譯,會不會預編譯強制重編譯?它似乎並不如此。這裏的錯誤不是一個compliation錯誤,它是一個方法調用錯誤,因爲「已更改」(在字節碼級別,而不是在代碼級別)方法簽名。

附錄:請注意,儘管JSP確實發生了更改,但即使使用接受的答案標誌集,JSP也不會重新編譯,但我們最近在生產中經歷過。那裏存在主要的bug,但是無論如何,JBoss正常關閉。此時它將成爲舊版本的JBoss,但如果您仍在使用它,刪除工作內容和tmp目錄是唯一可行的方法。

我並沒有改變接受的答案,僅僅是因爲它真的到了問題所在的地步。 JBoss的錯誤是一個單獨的問題。

回答

11

如果JSP是一個戰爭是被部署爲一個罐子的EAR的一部分的一部分,那麼我不清楚爲什麼你的JSP沒有被重新編譯。戰爭文件中的JSP不是比上次部署中的JBoss編譯的類文件具有更新的時間戳嗎?如果不是,那麼在部署之前是否可以將JSP作爲構建WAR/EAR的一部分來使用? [我指的是使用Unix「touch」命令,而不是手動觸摸每個JSP文件。]

或者,$ JBOSS/server/default/deploy/jboss-web.deployer/META-INF中的DeleteWorkDirOnContextDestroy設置/jboss-service.xml可能是你正在尋找的。它默認爲false,但將其設置爲true可能是您需要的。我認爲這應該在重新部署時刪除JSP的類文件,以便在首次訪問每個JSP時重新創建它們。

有關更多信息,請參閱https://jira.jboss.org/jira/browse/JBAS-3358

1

我不知道設置,但是刪除JBoss實例工作目錄中生成的Java類文件將導致下次調用JSP時重新編譯JSP。

+1

謝謝,但在生產部署期間實際上很難做到這一點。 – Yishai 2009-06-04 21:46:44

1

您可以改變JBoss啓動腳本以顯式刪除存儲已編譯的JSP的「tmp」和/或「work」目錄。 JBoss然後別無選擇,只能重新編譯它們。

不是微妙的,但它會做的工作。

0

你的一個選擇是在構建時預編譯所有的jsp。這會很快標記任何編譯錯誤。

你也可以在生產中做到這一點 - 加速第一次訪問,但我覺得你希望這更多的QA步驟比其他任何事情。如果是這樣,您可以將預編譯步驟添加到您選擇的構建工具中的測試階段 - 也就是您的CI環境。這將保證不編譯的jsp不會使其脫離測試。

上運行的預編譯任務的詳細信息請參見本:

Jboss Jasper configuration

希望這有助於。

+0

謝謝,我們確實這樣做。問題是構建腳本符合乾淨,並且在乾淨的編譯中,該示例沒有問題。這裏的問題是底層的JSP需要重新編譯才能工作,即使它沒有改變,重新編譯也可以工作,但是如果沒有重新編譯,JSP將無法正常工作。 – Yishai 2009-06-09 13:29:54

+0

足夠公平,它不會在構建上發現此錯誤。您是否考慮過預編譯生產? – Pablojim 2009-06-09 14:19:02

+0

你如何預編譯生產(你使用什麼設置)?它會重新編譯一切嗎? – Yishai 2009-06-09 19:14:52

0

某些JSP容器(按照JSP 1.2規範的8.4.2節)支持預編譯JSP頁面的能力。

要預編譯JSP頁面,用的查詢字符串訪問該網頁?jsp_precompile

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

JSP頁面將不會被執行。如果容器支持預編譯,那麼將根據需要編譯JSP頁面。

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

0

Pablojim在正確的軌道上。你只需要一些更多的信息來了解發生了什麼。這是我的理解。

在prod中,您更改了需要重新編譯其他jsps的jsp。爲了使它們重新編譯必須發生兩件事之一

  1. 需要刪除jsp的編譯版本。
  2. JSP本身的需要進行修改(或者即使它的「感動」 - 修改日期被更新)

如果您還需要驗證所有JSP中工作,他們都需要是precompiled using an ant task。這也允許你在war文件中部署帶有預編譯jsps的war文件。這應該可以解決你的問題。

如果您的文件沒有部署在戰爭文件中,而是以分解格式部署,則應在戰爭文件中部署seriously consider packaging your web app。這使它成爲在不同環境之間部署的一個很好的包。