背景與目標:
最好使用MyEclipse部署Web應用,在開發調試時,非常方式。資源文件修改可以自動的同步。修改Java文件,除非改變類的結構定義,也可以實現熱部署的效果。
后來使用Eclipse JEE版本原生的方式(WTP)部署Web應用,在這一方面的便利性大大降低。原因是一旦修改Java類,雖說Tomcat也不需要人自動重啟,但實際上,WebContext自動relead,實際還是相當於重啟。
其實,不僅僅是修改Java類,只是放在Eclipse作為source folder的文件修改,都可觸發tomcat的reload。
改善:
對此,一個改善的思路是:直接將tomcat的Context指向工程目錄下的WebRoot/WebContent。這樣,就免去了代碼同步的問題。
方法:
1、修改tomcat的server.xml。
在Eclipse創建Server,實際已經新建了一組catalina的配置文件,即原tomcat中的conf目錄。

2、手動添加項目引用。在Host結點下,添加Context節點。
- <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
- <!-- docBase指向工程目錄 path即Context名稱 -->
- <Context docBase="E:/code/workspace/SCM/WebRoot" path="/SCM" reloadable="false">
- </Context>
- </Host>
問題:很多項目引用的第三方包有統一的位置,並不直接放在工程下/WebContent/WEB-INF/lib下。在這種場景,將會導致ClassNotFoundException異常拋出。
再改善:
方法 一:
一些無關Classloader的類,主要是作為工具類引用的,可以放在tomcat的shared.loader下。這個可以通過設置catalina.properties目錄來實現。
但是此方法改變原有的類加載設計,可能工程需要做一些特別的改變。不具有普遍適應性。故略。
方法 二:
利用Tomcat配置的VirtualWebappLoader機制,告訴tomcat去加載第三方的其他jar文件。配置方法同樣在server.xml文件里。在前面加的Context下添加Loader。如下:
- <Context docBase="E:/code/workspace/SCM/WebRoot" path="/SCM" reloadable="false"> <Loader className="org.apache.catalina.loader.VirtualWebappLoader" searchVirtualFirst="false" virtualClasspath="E:/code/workspace/SimpleLibs/libs/*.jar"></Loader>
- </Context>
注意:上面的配置適用於Tomcat 7.X。在Tomcat 6.0設置virtualClasspath時,需要列舉出具體的jar,即不能使用*.jar。
題外話:可以自定義VirtualWebappLoader,但是在Eclipse方式啟動tomcat的情況下,已測的tomcat6.0無效。直接在tomcat/bin/startup.bat下可自定義。初步推斷原因是eclipse在catalina.base目錄下生成一個org.eclipse.jst.server.tomcat.runtime.60.loader.jar。里面重寫了WebappLoader。

