tomcat 熱部署、熱加載 精析

 

1.前言javascript

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

2.熱部署java

  原定義:tomcat處於運行狀態時,可以監測webapps下的文件,若是有新的web應用加入進來,會自運發佈這個WEB應用。web

  實現方式:將Host標籤的autoPlay設置爲true(這個是默認的)數據庫

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

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

  Host標籤,有屬性"autoPlay",其值爲"true",表示的含義是:緩存

  若是此項設爲true,表示Tomcat服務處於運行狀態時,可以監測appBase下的文件,若是有新有web應用加入進來,會自動發佈這個WEB應用。tomcat

  證實:服務器

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

  第二步:往該目錄下複製一個項目

  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鏈接數據庫

 

寫在最後

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

 相關推薦:

相關文章
相關標籤/搜索