tomcat 熱部署、熱加載 精析


 

1.前言

  找了很多篇文章,沒有一篇文章講的清晰、明了,很多人只是會用,但不是能真正說明白,這年頭找個懂理論的,真難!  

2.熱部署

  原定義:tomcat處於運行狀態時,能夠監測webapps下的文件,如果有新的web應用加入進來,會自運發布這個WEB應用。

  實現方式:將Host標簽的autoPlay設置為true(這個是默認的)

   打開tomcat的server.xml,你會發現:有一個<Host>標簽,如果你沒有修改過,就應該是這樣的:

 <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
...
</Host>

  Host標簽,有屬性"autoPlay",其值為"true",表示的含義是:

  如果此項設為true,表示Tomcat服務處於運行狀態時,能夠監測appBase下的文件,如果有新有web應用加入進來,會自動發布這個WEB應用。

  證明:

  第一步:啟動tomcat服務器,且webapps目錄下沒有web項目

  第二步:往該目錄下復制一個項目

  tomcat下執行結果:tomcat正在自動發布該項目

  第四步:將該項目從webapps目錄下移除

  tomcat下執行結果:取消該部署項目

  對於熱部署的延伸

  定義:對Java文件進行修改后,不需要重啟tomcat服務器,即時生效,即:在運行時更新Java類文件。

  實現方式:在Host標簽內添加Context標簽

<!-- 方式一 -->
<Context docBase="D:\workspace-eclipse\yyproject_jmjkk\WebRoot" path="/test"/>
<!-- 方式二 -->
<Context docBase="D:\workspace-eclipse\yyproject_jmjkk\WebRoot" path="/test" reloadable="false"/>

  注意:

  聲明reloadable屬性時,值必須設置為false;

  如果開發工具是eclipse,必須eclipse中修改server.xml,原因見熱加載。

  實現原理:

  以純JavaWeb項目為例,

  Java文件修改后,需要編譯成class文件,我們之所以沒有進行手動編譯,是因為依賴於eclipse的自動編譯功能(這件事eclipse幫我們做了);

  編譯好的class文件都會被放到WebContent/WebRoot/WEB-INF/classes目錄下;

  tomcat的Context標簽的docBase屬性的值指定為web項目的發布目錄(WebContent/WebRoot)后,啟動tomcat后,tomcat會直接訪問將該目錄下的文件;

  只有debug模式下才會將其加載到tomcat容器中;

  對於jsp的更新:jsp每次被調用,tomcat容器都會通過ClassLoader重新加載相應的jsp編譯后的class文件並裝載到JVM中;

  對於Java類的更新:當監聽到class文件被修改后,通過動態修改內存中的字節碼,將修改過的class文件再次裝載到JVM中。

3.熱加載

  當Context標簽的reloadable屬性的值為true時,就實現了熱加載。

  定義:tomcat服務器在運行狀態下會監視在WEB-INF/classes和WEB-INF/lib目錄下class文件的改動,如果監測到有class文件被更新的,服務器會自動重新加載Web應用。  

  前提:只有在debug模式下,該屬性才起作用,普通模式下,就算你reloadable="true",也不會生效(class文件不會被更新,tomcat不會重啟)。

  不推薦使用:因為只要你一修改代碼,都自動會重啟tomcat,我們必須等待項目重啟后才能操作,簡直是浪費時間。

  在debug模式下,修改完class文件后,即使不重啟tomcat,jvm也會即時生效(tomcat自動將更新后的文件裝載到JVM)。

  如何關閉tomcat的重啟?

  打開運行項目的tomcat的配置文件,server.xml

  將你已經發布的項目對應的Context標簽中的reloadable的值改為false,以debug模式重啟tomcat即可。

   

  說明:必須在eclipse中修改server.xml,不要跑到tomcat的安裝目錄下修改該文件。

  因為eclipse中server.xml會覆蓋tomcat本身自帶的server.xml,所以就算你修改了也不會生效!

4.Context標簽參數介紹

  <Context>代表了運行在<Host>上的單個Web應用;

  一個<Host>可以有多個< Context>元素,一個Context代表一個web應用;

  每個Web應用必須有唯一的URL路徑,這個URL路徑在<Context>中的屬性path中設定。
  <Context path="/helloApp" docBase="helloApp" reloadable="false"/>
  <Context>元素的屬性介紹:
  path:指定訪問該Web應用的URL入口;

    a.可以自定義訪問項目的請求路徑;b.該參數不能省略;c.該參數的值不能為空。
  docBase:指定Web應用的文件路徑,可以給定絕對路徑,也可以給定相對於<Host>的appBase屬性的相對路徑,

  如果Web應用采用開放目錄結構,則指定Web應用的根目錄,如果Web應用是個war文件,則指定war文件的路徑。

    絕對路徑構成:"項目的路徑"+"WebRoot/WebContent即WEB-INF的上級目錄"
  reloadable:WEB-INF/classes和WEB-INF/lib目錄下class文件內容發生改變時,是否重新發布

    如果這個屬性設為true,tomcat服務器在運行狀態下會監視在WEB-INF/classes和WEB-INF/lib目錄下class文件的改動,如果監測到有class文件被更新的,服務器會自動重新加載Web應用 ,也就是熱加載;    

UpdateTime--2016年12月25日09:19:24

好處:可以減少啟動tomcat次數  

說明:xml文件在項目啟動時,會將其加載到內存中,其他文件修改信息后可以不用重新發布
  其中,下面指定文件的內容發生變化時,不需要重啟tomcat
  *.jsp文件
  *.js文件 -->如果有緩存,可以采用問號傳參的方式避免緩存,在引入該文件的jsp頁面后添加"?v=111",例:
    <script type="text/javascript" src="<c:url value="/xnh/server/monitor/appro/hosappro_index.js?v=111"/>"></script>
  *.java文件 -->這種只適合修改方法里的內容,如果內容發生變化,提示需要重啟tomcat,則需要重啟
  *.grf文件
注意:
  *.xml,*.properties文件內容發生變化時,需要重啟tomcat才能生效
這種加載項目的方式與將項目發布到tomcat的區別:  

  區別一:上面指出的好處
  區別二:

    加載的項目會隨着的tomcat的啟動和關閉而產生或死亡,不會留下任何痕跡(work文件夾除外),而將項目發布到tomcat的方式,實際上是將項目發布到tomcat指定的發布目錄webapps文件夾,所以當切換運行項目時,采用熱部署的方式不會運行額外的項目,而采用發布的方式則需要將清理webapps文件夾才能保證只加載該項目到tomcat中

  區別三:啟動多個項目的方式不同    

  啟動前准備工作:
    在多個項目中的web.xml文件中添加配置

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>jmyb_ty</param-value>
</context-param>
<!-- <param-value>該參數值需確保唯一性</param-value> -->  

  熱部署方式可以同時啟動多個項目,只需要在server.xml文件中配置多個<Context></Context>標簽即可;
  采用發布方式,需先多次啟動將項目依次發布到webapps文件夾中,然后啟動tomcat。

具體配置:
  MYECLIPSE  

  找到tomcat的安裝路徑:D:\ProgramFiles\apache-tomcat-7.0.68-->config文件夾-->server.xml-->在<Host></Host>標簽里添加<Context></Context>標簽-->
ECLIPSE
  在eclipse中,左側視圖-->Server-->對應的tomcat-->server.xml-->在<Host></Host>標簽里添加<Context></Context>標簽-->

舉例:

<Context docBase="D:\WorkSpaces\eclipse2016\demo1\WebContent" path="/demo" reloadable="false">
</Context>

注意:

  a.<Context></Context>標簽的"C"一定得大寫;

  b.其中,<Context></Context>標簽中可以配置數據庫連接池,詳情見文章tomcat連接數據庫

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

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



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