2012-01-11 61 views
0

我的問題來自Tomcat 6.0.18升級到7.0.22,儘管在其他版本中可能會出現這個問題。我猜想這是因爲我誤解了Tomcat的核心行爲,儘管在搜索了Tomcat documentation之後,之前關於Tomcat的SO問題(太多無法有效引用)以及來自各種來源的各種博客帖子(再次沒有討論足夠的話題值得引用),我很茫然。tomcat如何生成其工作目錄* _jsp.java文件,以及可能導致它生成零字節的文件?

我正在使用的應用程序是一個具有數百個JSP頁面的龐大的Java應用程序。過去,在Tomcat 6上,我們在運行時編譯它們毫無困難。他們(大部分)在Tomcat的工作目錄中正確生成*_jsp.java文件,並且編譯爲* .class文件的工作正如預期的那樣。那些不是在生產設置中未使用的遺留代碼,仍然在代碼庫中,原因不值得在此指定。

當移動到Tomcat 7,特別是7.0.22時,我遇到了意外的行爲。絕大多數JSP頁面都可以編譯到(.java代碼及其附屬的.class文件),並且很好地嵌入到工作目錄中。但是,有些文件會生成0字節的.java文件。

我先來這個問題是:「關於Tomcat的JSP編譯東西兩個版本之間的變化,其他則JSP規範本身。」撥打in the docs後,似乎沒有什麼明顯的,所以我attempted to pre-compile all the jsps using Ant

這隻要成功爲.java文件中涉及的轉換,用一個非常簡單的ant腳本:

<project name="myApp" default="all" basedir="."> 
    <import file="${tomcat.home}/bin/catalina-tasks.xml"/> 
    <target name="jspc"> 
     <jasper 
      validateXml="false" 
      uriroot="${webapp.home}" 
      webXmlFragment="${webapp.home}/WEB-INF/generated_web.xml" 
      outputDir="${webapp.home}/WEB-INF/classes" 
      failonerror="false" /> 
    </target> 
    <target name="all" depends="jspc"> 
    </target> 
</project> 

*_jsp.java文件被正確地jasper生成,編譯時造成麻煩的0字節文件通過Tomcat進入工作目錄,用這種方法正確編譯。與Tomcat 6的工作目錄*_jsp.java文件相比,有一些細微差異,但它們似乎與JSP spec version upgrade between 6 and 7有關。不幸的是,我們的遺留代碼通常在兩個版本中都使得一些.java文件無法編譯。使他們從編譯到.java.class(相對於.jsp*_jsp.java*_jsp.class)將需要深重構。因此,我無法追求真正的JSP預編譯策略。 Tomcat似乎更聰明地處理這些文件,然後是我的腳本,這並不令人意外。

我的問題,那麼,確實有點更廣:什麼可能導致Tomcat能夠產生在其工作目錄空*_jsp.java文件?作爲推論,Tomcat通過什麼過程在其工作目錄中生成這些文件,以及這與我可能使用Ant腳本生成這些文件的方式有何不同?我懷疑對Tomcat核心行爲的更深入的理解可能會產生一個明顯的解決方案,一個可解釋的問題,或者至少是「這是設計的,請重構」的答案。

+0

我不知道0字節的文件,但如果遺留的非編譯JSP未使用,爲什麼不刪除它們。如果它們被使用了,爲什麼不修復它們? – 2012-01-11 07:16:32

+0

其中一些是我正在努力刪除的未使用的遺留文件。其他人比較老[JSP不遵循最佳實踐](http://stackoverflow.com/a/3180202/877115)。我很想修復這些麻煩的代碼,因爲預編譯似乎是出於性能原因的一個好主意,但不幸的是,重構對於我的組織來說是不起作用的。 – Christopher 2012-01-11 15:19:46

+0

他們編譯還是不編譯?如果他們不編譯,他們不需要重構:他們需要被修復或刪除。如果它們不通過預編譯進行編譯,那麼也不會在Tomcat中進行編譯。 – 2012-01-11 15:27:07

回答

0

我們有類似的問題,並在我們的上下文中找到了原因:一旦tomcat啓動,我們在持續集成環境中運行硒測試,因此部署尚未完成,並以某種方式產生了0長度)* jsp.java和* jsp.class文件。 有趣的是,這發生在所有構建中,因爲部署總是比開始運行測試花費的時間更長(約1米)。

我們通過引入一個延遲來解決它,允許內部tomcat部署者完成其工作。