天天看點

tomcat啟動腳本分析

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