Eclipse的Tomcat熱部署,免重啟的方法


背景與目標:

      最好使用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節點。

   

Xml代碼   收藏代碼
  1. <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">  
  2.        <!-- docBase指向工程目錄  path即Context名稱 -->  
  3.     <Context docBase="E:/code/workspace/SCM/WebRoot" path="/SCM" reloadable="false">  
  4.     </Context>  
  5.   
  6. </Host>  

 

 

 

問題:很多項目引用的第三方包有統一的位置,並不直接放在工程下/WebContent/WEB-INF/lib下。在這種場景,將會導致ClassNotFoundException異常拋出。

 

 

再改善:

方法 一:

       一些無關Classloader的類,主要是作為工具類引用的,可以放在tomcat的shared.loader下。這個可以通過設置catalina.properties目錄來實現。

      但是此方法改變原有的類加載設計,可能工程需要做一些特別的改變。不具有普遍適應性。故略。

 

方法 二:

      利用Tomcat配置的VirtualWebappLoader機制,告訴tomcat去加載第三方的其他jar文件。配置方法同樣在server.xml文件里。在前面加的Context下添加Loader。如下:

  

Xml代碼   收藏代碼
  1. <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>  
  2. </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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM