1. 程式人生 > >Eclipse/ tomcat 實現熱部署和熱啟動

Eclipse/ tomcat 實現熱部署和熱啟動

1、 熱部署:就是容器狀態在執行的情況下重新部署整個專案.在這種情況下一般整個記憶體會清空,重新載入.簡單來說就是Tomcat或者其他的web伺服器會幫我們重新載入專案.這種方式可能會造成session丟失等情況。

2、熱載入:就是容器狀態在執行的情況下重新載入改變編譯後的類.在這種情況下記憶體不會清空,sessin不會丟失,但容易造成記憶體溢位,或者找不到方法。因為記憶體無法轉變成對像. 一般改變類的結構和模型就會有異常,在已經有的變數和方法中改變是不會出問題的。

eclipse配置熱啟動:

        在基於Java的實現熱部署、熱載入的過程中,類裝入器扮演著重要的角色。類裝入器不能重新裝入一個已經裝入的類,否則會報java.lang.LinkageError,但只要使用一個新的類裝入器例項,就可以將類再次裝入一個正在執行的應用程式。一般debug模式都支援熱載入。

       但我在這裡遇到了eclipse使用debug啟動卻並沒有熱載入的狀況,這樣對於開發來說是非常耗時的,因為每更改一次class檔案都需要重新編譯。下面我就如何使用eclipse進行熱載入,做一個簡單介紹:

啟動eclicpse 找到下面這個目錄

 開啟server.xml,找到

<Context docBase="dreamlive" path="/ROOT" reloadable="true" crossContext="true" source="org.eclipse.jst.jee.server:dreamlive"/>  

這行程式碼,在你部署新專案的時候,docBase和source會隨著改變,現在還是熱部署的狀態,這樣每次更改class檔案都會自動的去編譯,比較耗時,接下來我們更改一下配置:

 <Context docBase="dreamlive" path="/ROOT" reloadable="false" crossContext="true" source="org.eclipse.jst.jee.server:dreamlive"/></Host>

 這裡將reloadable改為false,新增crossContext="true",這樣就能進行 熱啟動 了,注意:需要用debug啟動

不過我們需要在每次部署新專案的時候,重新去更改這個配置,我們可以觀察每次部署新專案的時候,server.xml這個檔案的動態變化,設定完成之後如果啟動專案熱載入並沒有生效,那麼勾選eclipse-->project-->Build Automatically,加上自動編譯。

下面附上每個屬性的含義   

  1.   path 指出你的訪問路
  2.   docBase指出你的存放路徑
  3.   debug 為設定debug的等級0提供最少的資訊,9提供最多的資訊
  4.   reloadable=true時 當web.xml或者class有改動的時候都會自動重新載入不需要從新啟動服務
  5.   crosscontext="true"表示配置的不同context共享一個session(可以不配置)

Tomcat配置熱啟動

熱部署是指在你修改專案BUG的時候對JSP或JAVA類進行了修改在不重啟WEB伺服器前提下能讓修改生效。但是對配置檔案的修改除外!

1、直接把專案web資料夾放在webapps裡。


2、在tomcat\conf\server.xml中的<host></host>內部新增<context/>標籤:
<Context debug="0" docBase="D:\demo1\web" path="/demo1" privileged="true" reloadable="true"/>

docBase:專案路徑,可以使用絕對路徑或相對路徑,相對路徑是相對於webapps
path:訪問專案的路徑,如:http://127.0.0.1:8080/demo1
reloadable:是否自動載入新增或改變的class檔案.
debug屬性與這個Engine關聯的Logger記錄的除錯資訊的詳細程度。數字越大,輸出越詳細。如果沒有指定,預設為0。 也就是程式異常時寫入日誌檔案裡的詳細程度。


3、第三種方式和第二種差不多,但是不是在Server.xml檔案中新增Context標籤,而是在
%tomcat_home%\conf\Catalina\localhost中新增一個XML檔案,

如:demo1.xml,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:\demo1\web" reloadable="true" />
,只是缺少了path屬性,如果你硬寫個path="demo2"的話,是沒有用的,tomcat不明確的告訴你:“我不認得”,
這種方式伺服器會使用xml檔案的名字作為path屬性的名字,SO訪問地址為:http://localhost:8080/demo1
 

=========================================================================================


還有一種方式:使用第三方工具

http://www.zeroturnaround.com/jrebel/

1、解壓縮包

2、執行java -jar jrebel-setup.jar

3、會彈出一個安裝介面(自己看,很好懂)

4、在MyEclipse中配置,找到伺服器(如tomcat)的配置頁面,在tomcat的jdk配置頁面的Optional Java VM arguments輸入框中加如下引數:

-noverify -javaagent:D:\dev\JRebel\jrebel.jar -Drebel.dirs=D:\dev\apache-tomcat-6.0.20\webapps\nmr

第一個路徑是jar包的絕對路徑,第二個地址是說想讓哪個目錄下的類更改後不重啟服務。

如果Optional Java VM arguments輸入框中有其他引數,用空格隔開。

5、釋出專案,就能在控制檯看到效果。

類就可以改變之後不用重啟tomcat。

目前流行的伺服器都支援。詳細看官方網站。

下載的壓縮包檔名為jrebel-setup.zip (7.8 MB)
可參考:http://japankn.javaeye.com/blog/577931