1. 背景
用了很多年的Tomcat, 無論開發環境還是生產環境, 應該說, 大家對它還是基本滿意的。不過, 也不是一點問題沒有。 從開發人員的角度來說, Tomcat主要的缺點就是較弱的熱部署(hot deploy)能力。 修改一個Java類, 保存後, Tomcat會重新加載這個類, 但不久就要重新啟動Tomcat才能繼續開發。 在企業關鍵應用的場景下, 若發生急迫的程序缺陷更正, 讓眾多的用戶停止手頭的工作, 等待服務器重新啟動, 顯然十分不便。
類似RubyOnRails的技術框架, 其方便之處就是腳本語言不要編譯, 保存後直接可以使用。 Java社區顯然看到了這個問題, GlassFish v2 的熱部署能力就是其主要的一個受大家歡迎的特性。 這也是我們要用 GlassFish v2 替換 Tomcat 5.x 的主要理由。
2. 使用環境
本文假設你使用下面所述的開發環境.
(1) JDK 1.5 或 1.6
(2) Eclipse IDE for Java EE Developers (3.3.1.1 M20071023-1652)
(3) 使用 com.sysdeo.eclipse.tomcat_3.2.1 插件
如果你沒有使用 Eclipse 3.3.1.1 Java EE 版本, 而是正在使用其他版本, 也不影響本文所述的所有操作和效果, 只是不能借助Eclipse 啟動和停止 GlassFish v2, 只能自己通過命令行進行操作.
有關用 Eclipse 3.3.1.1 Java EE 版本操作 GlassFish v2 的詳細說明, 請參見 Eclipse 3.3 and GlassFish Java EE 5 integration.
3. 下載並安裝 GlassFish v2
這方面的資料已經很容易從網上找到, 比較好的文章如下:
(1) 在Glassfish上部署web應用
(2) Glassfish初試
(3) 從tomcat到glashfish(glassfish的安裝啟動筆記)
4. 創建 Tomcat 項目
相信你一定也知道如何創建 Tomcat 項目. 本文假設你創建的 Tomcat 項目:
(1) 位於 D:/Sample 目錄.
(2) Context name 為 Sample.
其他采用默認設置.
5. 為測試 GlassFish v2 的熱部署能力, 創建首頁JSP和Servlet Java類.
第1步: 在根目錄中創建 index.jsp 文件
第2步: 在 WEB-INF\src 中, 創建一個簡單的 servlet 類 SampleServlet.java,
第3步: 配置web.xml文件.
完整的Sample項目, 請參見附件.
6. 什麼是 GlassFish v2 的目錄部署?
用Tomcat開發時, JSP/HTML/JS/CSS 等文件, 都是修改後保存, 刷新浏覽器就可以使用.為了使 GlassFish v2 達到同樣的效果, 需要使用其目錄部署(directory deployment)特性.
這個特性不太容易找, 因為使用象GlassFish這樣的全功能應用服務器的開發人員,習慣了"編輯、編譯、部署、運行"這樣的步驟. 一開始, 我按照 Eclipse 3.3 and GlassFish Java EE 5 integration.一文的指引, 發現修改JSP文件後,仍然要經歷上面的部署過程. 雖然Eclipse會通過自動檢測文件版本的變化, 觸發Ant任務實現部署, 但仍然很浪費時間. 我們需要找到跳過"部署"的方法. 在GlassFish官方論壇上發了幾個帖子, 答復者的回帖沒有起到什麼作用, 但通過搜索論壇基本知道這個問題已經得到了解決.
下面的文章引導我朝著正確的方向前進了一大步(非常感謝該文作者):
GlassFish Auto Deployment and Hot Deployment
關於目錄部署的詳細說明,參見:
Sun Java System Application Server Platform Edition 9.0 Application Deployment Guide
Chapter 1 中 Deployment for Development 一節
7. GlassFish v2 的目錄部署實戰
第1步: 啟動 GlassFish v2.
第2步: 部署 Sample 項目到 GlassFish v2, DOS窗口下執行命令:
GLASS_FISH_HOME/bin/asadmin deploydir D:/Sample
其中 GLASS_FISH_HOME 是 GlassFish 的安裝目錄, 命令執行完畢後,可以看到成功部署信息.
第3步: 打開浏覽器, 輸入http://localhost:8080/Sample/index.jsp, 看到頁面內容.
第4步: 打開浏覽器, 輸入 http://localhost:8080/Sample/servlet/Sample, 看到頁面內容.
8. 體驗 GlassFish v2 的熱部署特性
第1步: 修改 index.jsp 文件內容, 保存後, 刷新浏覽器, 你就能馬上看到新的內容.
( http://localhost:8080/Sample/index.jsp)
第2步: 修改 SampleServlet.java, 保存後, 等待片刻, Eclipse 已經自動編譯這個類, 但 GlassFish v2 控制台中沒有任何提示, 刷新浏覽器, 看不到新的內容.
( http://localhost:8080/Sample/servlet/Sample)
第3步: 現在, 在 Sample 項目根目錄中創建文件名為".reload"的文件(內容為空).
第4步: 觀察GlassFish v2 控制台, 可以看到重新加載信息,刷新浏覽器
(http://localhost:8080/Sample/servlet/Sample)
到了新的內容.
第5步: 再次修改 SampleServlet.java 的內容, 保存後, 遇到和第2步同樣的問題.
第6步: 再次打開 .reload 文件, 輸入任意內容, 然後保存.
第7步: 再次出現與第4步同樣的效果.
總結上述操作, GlassFish v2 對於非Java類的加載, 達到了和Tomcat同樣的效果, 但Java類的加載, 需要通過 .reload 文件的時間戳來控制. 這種做法對開發有好處, 在調試改錯時, 可以修改多個 Java 類文件, 然後讓 GlassFish v2 一次加載全部修過的類.
9. 自動化 .reload 文件時間戳刷新
上一節中, 手工打開 .reload 文件, 通過修改其內容刷新其時間戳, 這種做法太麻煩.
在 unix/linux 平台下, 通過命令 touch 刷新 .reload 文件的時間戳. 在 Window 平台, 也有
人實現了 touch. 我在 CodeProject 網站找到一個 touch.exe: Touch for Windows - The Code Project - Free Tools,很好用, 並且可以集成到 Eclipse 的工具條按鈕中來執行 touch 命令(touch.exe 已經包括在附件中).
第1步: 拷貝下載的 touch.exe 到 Sample 項目根目錄.
第2步: 在 Eclipse 下, 選擇 Run > External Tools > Open External Tools Dialog.
第3步: 選中左側 Program 節點, 右擊, 選擇New菜單項.
第4步: 在右側出現的對話框中, 填入下面的內容
Name: SampleTouch
Main[頁面]
Localtion: ${workspace_loc:/Sample/touch.exe}
Working Directory: ${workspace_loc:/Sample}
Arguments: .reload
Common[頁面]
Display in favorites menu: 選中External Tools
保存後, 你可以在Eclipse的Run工具條按鈕中看到新創建的項.
10. 結語
用 GlassFish v2 可以完全替換 Tomcat 5.x, 在開發中它保留了 Tomcat 好的特性的同時,給我們帶來了強壯的熱部署功能, 顯著地提高了開發效率.
感謝GlassFish v2, 感謝為之付出心血的Java社區成員, 是他們讓我們感受到了技術進步的喜悅.