Tomcat的启动脚本浅析(一)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值