Tomcat是應用頗廣的Servlet和JSP的容器,可以說幾乎每個學習JSP的人都接觸過它。在實際開發環境中,它還可以作為輕巧靈便的應用伺服器用來調試和部署。在Tomcat上開發的Servlet和JSP程式,可以非常友善地部署到Weblogic及Websphere等生産伺服器上去。有些情況下,它還可以和Apache Web Server配合使用,作為小型企業的Web Application Server。本文以Tomcat5.0.28為例,讨論一下Tomcat的啟動過程及常見問題。大家都知道,Tomcat最普遍的啟動方法就是在DOS指令行視窗中執行Tomcat的bin目錄下的startup.bat檔案(輕按兩下該檔案即可啟動)。
1. startup.bat腳本解析
下面我們首先來看看startup.bat腳本是如何啟動Tomcat的。Startup腳本非常明了,它的主要任務就是先設定CATALINA_HOME的環境變量,讓該環境變量指向Tomcat的安裝目錄;然後在安裝目錄的bin子目錄下找catalina.bat檔案,如果找不到,就列印出錯誤資訊并退出,如果在bin目錄下找到catalina.bat檔案,就準備執行該檔案。不過,在執行該檔案之前,startup腳本還做了一件工作,那就是尋找參數。startup腳本可以帶多個參數,在Java主類中,第一個參數為args[0],而在MS-DOS腳本中,第一個參數可以通過”%1”得到,如果您想要得到DOS腳本中得到第二個參數,調用”%2”。但是,在腳本參數數目未知的情況下,我們就隻能通過goto循環調用shift指令來獲得腳本的所有參數,下面這個簡單的實驗腳本有助于我們了解如何使用shift指令。
@echo off
echo Print parameters by %%1 and shift loop
:loopStart
if ""%1""=="""" goto loopEnd
echo Paramter is %1
shift
goto loopStart
:loopEnd
如果把上面的腳本儲存成test.bat并在DOS中執行該腳本,執行結果如下。
下面就是Startup.bat腳本的詳細注釋,如果想要在DOS腳本中注釋一行,前面加上rem即可,這相當于Java的雙斜杠(//)注釋,下面程式中,凡是以REM開頭然後接着中文的行,都是筆者加上的注釋,以幫助讀者了解該腳本。
@echo off
if "%OS%" == "Windows_NT" setlocal
rem ---------------------------------------------------------------------------
rem Start script for the CATALINA Server
rem
rem $Id: startup.bat,v 1.6 2004/05/27 18:25:11 yoavs Exp $
rem ---------------------------------------------------------------------------
rem 首先定義一個變量 CURRENT_DIR,然後把目前目錄作為一個字元串賦給它
rem Guess CATALINA_HOME if not defined
set CURRENT_DIR=%cd%
rem 如果CATALINA_HOME變量已經指派,程式轉到gotHome行繼續
if not "%CATALINA_HOME%" == "" goto gotHome
rem 把目前目錄的值作為字元串賦給 CATALINA_HOME變量
set CATALINA_HOME=%CURRENT_DIR%
rem 如果目前目錄的bin子目錄下發現catalina.bat檔案,程式轉到okHome行繼續
rem 否則執行下一行“cd..”。
Rem 因為預設情況下目前目錄就是bin目錄,是以預設情況下程式不轉入okHome行
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
rem 回上層目錄
cd ..
rem 把目前目錄的上層目錄作為字元串賦給再次CATALINA_HOME變量,覆寫第一次的指派
set CATALINA_HOME=%cd%
rem 重新回到目前目錄
cd %CURRENT_DIR%
:gotHome
rem 如果在目前目錄的父目錄的bin子檔案夾下發現catalina.bat檔案,程式轉到okHome行繼續
rem 否則程式列印兩行錯誤資訊,然後退出
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
rem 設定一個變量,存儲catalina.bat的完整路徑
set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat
rem 再次檢查catalina.bat是否存在,如果不存在,列印兩行錯誤資訊,退出
rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find %EXECUTABLE%
echo This file is needed to run this program
goto end
:okExec
rem 檢查腳本是否帶參數,如果發現參數,把第一個參數指派給 CMD_LINE_ARGS變量
rem 如果腳本帶有多個參數,程式設定了一個循環setArgs,
rem 不斷把所帶的參數加到CMD_LINE_ARGS變量中
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
rem 執行catalina.bat腳本,該腳本的第一個參數為start,後面的參數是從本腳本中傳入的
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
那麼讀者也許要問,問什麼要通過startup腳本來調用catalina腳本,直接一個腳本不更友善嗎?細心的讀者或許會發現,在預設情況下,startup腳本隻能放在兩個位置,一是Tomcat的安裝目錄,一個就是Tomcat安裝目錄的bin子目錄。這是什麼意思呢?如果Tomcat安裝目錄是C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28,那麼startup腳本隻能放在C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28\目錄或者C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28\bin目錄下才能運作,如果拷貝startup檔案到其它目錄,我們就會看到下面的錯誤(以Tomcat運作在C:\carl目錄下為例):
C:\carl>startup
CATALINA_HOME C:\
The CATALINA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
那麼,如果我們想讓Tomcat在桌面上能成功啟動,那麼該怎麼辦呢?當然,我們首先想到的是為startup建立一個快捷方式,然後拷貝該快捷方式到桌面,這是一種辦法。另一種辦法就是修改startup.bat檔案,在startup.bat腳本的第八行處添上一句腳本,讓 CATALINA_HOME變量指向使用者Tomcat的安裝路徑,這樣,startup.bat就可以拷貝到機器的任何目錄執行。這個startup.bat腳本就是提供給使用者用來修改的,我們可以在其中設定JAVA_HOME,CATALINA_HOME等環境變量,但我們并不需要深入到較為複雜的catalina.bat腳本中,這正是startup.bat腳本的真正用意所在。我們知道,軟體設計模式中有一個重要的原則就是開閉原則,即我們可以允許别人擴充我們的程式,但在程式釋出後,我們拒絕任何修改,因為修改會産生新的Bug,使得我們已經Bug-free的程式又要重新測試。開閉原則是面向對象世界中的一個非常重要的原則,我們可以把這個原則從Java類擴充至源代碼級别。startup腳本就是要求使用者不要修改catalina.bat腳本,這是符合軟體設計思想的。我們如果想要徹底貫徹這個重要的軟體設計原則,可以寫一個新腳本tomcat.bat,腳本内容大緻如下:
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09
set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28
call %CATALINA_HOME%\bin\startup.bat
這個tomcat.bat檔案可以存放在任何目錄并能執行,并且不需要修改tomcat自帶的任何腳本及其它環境變量,這就徹底貫徹了開閉原則。
原文摘自http://blog.ccidnet.com/blog-htm-do-showone-uid-4092-itemid-246996-type-blog.html