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自带的任何脚本及其它环境变量,这就彻底贯彻了开闭原则。
[未完待续]