按月等额本息计算器:catalina.bat脚本解析

来源:百度文库 编辑:中财网 时间:2024/04/29 10:27:44

当startup脚本完成环境变量的设置后,就开始调用catalina.bat脚本来启动Tomcat。Catalina脚本的主要任务是根据环境变量和不同的命令行参数,拼凑出完整的java命令行,调用Tomcat的主类org.apache.catalina.startup.Bootstrap来启动Tomcat。我们先不解析该脚本,而是写一个简单的测试脚本来调用这个程序,看看测试结果,从而理解该脚本的调用方法。
测试脚本如下:
rem 请将JAVA_HOME环境变量修改到您的JDK安装目录
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09
rem 请将CATALINA_HOME环境变量修改到您的Tomcat安装目录
set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28
rem 开始调用catalina.bat文件
call %CATALINA_HOME%\bin\catalina.bat
我们把上面的脚本保存为start_tomcat_nothing.bat文件,然后在MS-DOS下执行,我们将看到如下的执行结果。

这个脚本并没有成功启动Tomcat,但是它给我们提供调用catalina.bat脚本的方法,请阅读上面窗口中的加亮部分。Catalina.bat的调用方法为 catalina后面加上具体命令参数,这个命令参数有以下9种。
具体解释如下:
debug在调试器中启动Tomcat
debug -security带有安全管理器的调试器中,调用catalina脚本来启动Tomcat
jpda start调用catalina脚本,在JPDA调试器中启动Tomcat
run 在当前窗口内调用catalina脚本来启动Tomcat(不切换窗口)
run -security 带有安全管理的情况下,在当前窗口内调用catalina脚本来启动Tomcat(不切换窗口)
start 开始一个新的DOS窗口,并在其中启动Tomcat(切换至新窗口)
start -security带有安全管理的情况下,在新的DOS窗口中启动Tomcat(切换至新窗口)
stopcatalina脚本执行停止命令来关闭Tomcat
version 您使用的Tomcat版本
看完上面的解释,我们对Tomcat的启动参数有所了解。好,咱们写一个最简单的脚本来测试一下,拷贝刚才start_tomcat_nothing.bat脚本,将它重新命名为start_tomcat_version.bat,该脚本的内容和start_tomcat_nothing.bat脚本几乎一致,只是最后一行多加了一个version命令,start_tomcat_version.bat脚本全部内容如下:
rem 请将JAVA_HOME环境变量修改到您的JDK安装目录
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09
rem 请将CATALINA_HOME环境变量修改到您的Tomcat安装目录
set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28
rem 开始调用catalina.bat文件
call %CATALINA_HOME%\bin\catalina.bat version
我们可以在DOS下观察该脚本的执行结果。

该脚本顺利执行,执行的结果告诉我们当前Tomcat的版本号为5.0.28。有兴趣的读者朋友可以试试其它的8个命令参数,这些命令参数有时对我们非常有用。举例来说,有时候我们正常启动Tomcat时,Tomcat弹出一个DOS窗口,但是瞬间消失,我们看不出到底哪里出了问题,也无任何启动日志可看。在这种情况下,我们可以使用run命令在同一个窗口内启动Tomcat,不让Tomcat弹出新的DOS窗口,好让我们看看Tomcat到底为什么没有启动。测试这个问题的简单方法如下。
首先,请到Tomcat安装目录下的bin子目录,把Tomcat的启动jar文件bootstrap.jar重命名为bootstrap_1.jar,然后点击startup.bat文件启动,我们会看到一个小黑窗口闪了一下,但是Tomcat并没有正常启动,这是因为startup.bat执行的是Tomcat的缺省命令start,该命令将在开始一个新的DOS窗口,并在其中启动Tomcat。在这种情况下,我们就要借重于run命令了,我们改以下我们上面的start_tomcat_version.bat脚本,将version命令改为run命令,然后另存为start_tomcat_run.bat,该脚本全部内容如下:
rem 请将JAVA_HOME环境变量修改到您的JDK安装目录
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09
rem 请将CATALINA_HOME环境变量修改到您的Tomcat安装目录
set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28
rem 开始调用catalina.bat文件
call %CATALINA_HOME%\bin\catalina.bat run
脚本的执行结果如下:

请观察上面窗口中的加亮部分,这部分向我们清楚地展示Tomcat的启动错误,没有找到Tomcat的启动主类Bootstrap。这是因为我们人为地把Tomcat的启动jar文件包从bootstrap.jar重命名为bootstrap_1.jar,这个bootstrap.jar文件既然不存在,那包含在这个文件的Bootstrap.class文件当然也就找不到了。
现在,我们再回过头看看这个catalina.bat脚本。为简单起见,我们假定该脚本带缺省命令行参数start,看看catalina脚本的执行流程。如果您对catalina的security命令有兴趣,请参考Sun公司的文档http://java.sun.com/j2se/1.5.0/docs/guide/security/smPortGuide.html;如果您对jpda命令有兴趣,不妨浏览一下http://java.sun.com/javase/technologies/core/toolsapis/jpda/ 文档。让我们打开catalina脚本,首先请注意这个脚本第二行有一个setlocal的命令,这个命令表明catalina中的环境变量只在本脚本中起作用,对其它程序和命令不起作用,这就意味着这个脚本中的环境变量是局部变量,不是全局变量,不会影响其它脚本和操作系统环境。
然后我们会看到长达34行的注释,这是优秀程序员必须学会的基本功之一。这些注释写得非常简洁明了,详细说明了各个环境变量的意义和用途。紧接着,如果发现CATALINA_HOME变量没有定义,该脚本试图设置该变量,这和startup.bat的第一节完全类似,在此不再赘述。然后该脚本调用setclasspath.bat到JAVA_HOME的bin目录下寻找java.exe、javaw.exe、jdb.exe和javac.exe所在的路径,并把这些exe文件的文件名和路径赋值到相应的环境变量_RUNJAVA、_RUNJAVAW、_RUNJDB和_RUNJAVAC中。再接下来,catalina脚本判断是否定义有环境变量CATALINA_BASE,CATALINA_TMPDIR,如果定义了它们,就执行相应的操作。因为我们在此并没有定义它们,所以执行不到这些操作。然后,catalina脚本将在本窗口内打印出四个环境变量的值,这四个环境变量我们非常熟悉,一旦启动Tomcat,我们必定能看到CATALINA_BASE,CATALINA_HOME,CATALINA_TMPDIR和JAVA_HOME。然后catalina脚本根据其后跟的不同命令,拼凑出完整的JAVA命令行并执行。下面是该脚本的详细注释:
Rem 获得标准的环境变量,因为setenv.bat不存在,所以下面这两句不执行
rem Get standard environment variables
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
Rem 调用setclasspath.bat脚本,获得标准的环境变量
rem Get standard Java environment variables
if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
echo Cannot find %CATALINA_HOME%\bin\setclasspath.bat
echo This file is needed to run this program
goto end
:okSetclasspath
set BASEDIR=%CATALINA_HOME%
call "%CATALINA_HOME%\bin\setclasspath.bat"
rem根据不同情况在classpath中加上不同的jar包
rem Add on extra jar files to CLASSPATH
if "%JSSE_HOME%" == "" goto noJsse
set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar
:noJsse
Rem 注意下面的这个jar文件是tomcat的启动包
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar
rem 我们没有定义CATALINA_BASE,下面这节不执行
if not "%CATALINA_BASE%" == "" goto gotBase
set CATALINA_BASE=%CATALINA_HOME%
:gotBase
rem 我们没有定义CATALINA_ TMPDIR,下面这节将忽略
if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
set CATALINA_TMPDIR=%CATALINA_BASE%\temp
:gotTmpdir
Rem 打印4个我们非常熟悉的环境变量
rem ----- Execute The Requested Command ---------------------------------------
echo Using CATALINA_BASE:   %CATALINA_BASE%
echo Using CATALINA_HOME:   %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
echo Using JAVA_HOME:   %JAVA_HOME%
rem 定义一些环境变量
set _EXECJAVA=%_RUNJAVA%
rem 这是Tomcat启动的主类
set MAINCLASS=org.apache.catalina.startup.Bootstrap
rem 这是catalina脚本的缺省命令start
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=
rem 我们的第一个参数命令是start,下面这节将忽略不执行
if not ""%1"" == ""jpda"" goto noJpda
set JPDA=jpda
if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
set JPDA_TRANSPORT=dt_shmem
:gotJpdaTransport
if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
set JPDA_ADDRESS=jdbconn
:gotJpdaAddress
shift
:noJpda
rem 我们的第一个参数命令是start,所以程序将走到doStart标签处执行
if ""%1"" == ""debug"" goto doDebug
if ""%1"" == ""run"" goto doRun
if ""%1"" == ""start"" goto doStart
if ""%1"" == ""stop"" goto doStop
if ""%1"" == ""version"" goto doVersion
rem 如果catalina后跟的命令不是debug, run, start, stop或version,
rem 该脚本将打印出catalina的用法,然后结束。
Rem 详情请见我们前面的测试脚本start_tomcat_nothing.bat及相应的结果窗口
echo Usage: catalina ( commands ... )
echo commands:
echo   debug   Start Catalina in a debugger
echo   debug -security   Debug Catalina with a security manager
echo   jpda start   Start Catalina under JPDA debugger
echo   run   Start Catalina in the current window
echo   run -security   Start in the current window with security manager
echo   start   Start Catalina in a separate window
echo   start -security   Start in a separate window with security manager
echo   stop   Stop Catalina
echo   version   What version of tomcat are you running?
goto end
rem 执行debug命令,我们的第一个参数命令是start,下面这节将忽略不执行
:doDebug
shift
set _EXECJAVA=%_RUNJDB%
set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\jakarta-tomcat-catalina\catalina\src\share"
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
goto execCmd
:doRun
shift
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
goto execCmd
rem 执行start命令
:doStart
Rem 将参数列表指针指向下一个参数
shift
rem 设置Tomcat启动窗口的标题,缺省值为Tomcat
if not "%OS%" == "Windows_NT" goto noTitle
set _EXECJAVA=start "Tomcat" %_RUNJAVA%
goto gotTitle
:noTitle
set _EXECJAVA=start %_RUNJAVA%
:gotTitle
Rem 检查第二个命令参数是否为-security,我们没有第二个命令参数,脚本将执行至execCmd标签处
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
goto execCmd
rem 执行stop命令,我们的第一个参数命令是start,下面这节将忽略不执行
:doStop
shift
set ACTION=stop
goto execCmd
rem 执行version命令,我们的第一个参数命令是start,下面这节将忽略不执行
:doVersion
%_EXECJAVA% -classpath "%CATALINA_HOME%\server\lib\catalina.jar" org.apache.catalina.util.ServerInfo
goto end
rem 执行命令,首先看看命令行参数是否不只一个,我们本例只有一个start参数,所以下面这节将不执行
:execCmd
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 执行java命令行
rem Execute Java with the applicable properties
rem 检测JPDA和Security变量,我们本例没有定义他们,下面两句将忽略
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
rem 程序将执行下面的java命令,在新窗口内启动Tomcat
%_EXECJAVA%%JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -classpath "%CLASSPATH%"-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%"-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS%%ACTION%
Rem catalina至此结束,下面代码我们将忽略。
goto end
:end