tomcat启动时的两个批处理脚本详解

本文详细解析了Tomcat服务器的启动过程,包括startUp.bat和catalina.bat两个批处理文件的工作原理。startUp.bat负责查找catalina.bat并传递命令行参数,而catalina.bat则设置必要的环境变量并启动Tomcat。

 

一.startUp.bat批处理文件解析。

startUp.bat去掉注释后的内容:

@echo off

if "%OS%" == "Windows_NT" setlocal

set "CURRENT_DIR=%cd%"

if not "%CATALINA_HOME%" == "" goto gotHome

set "CATALINA_HOME=%CURRENT_DIR%"

if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome

cd ..

set "CATALINA_HOME=%cd%"

cd "%CURRENT_DIR%"

:gotHome

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

set "EXECUTABLE=%CATALINA_HOME%/bin/catalina.bat"

if exist "%EXECUTABLE%" goto okExec

echo Cannot find "%EXECUTABLE%"

echo This file is needed to run this program

goto end

:okExec

set CMD_LINE_ARGS=

:setArgs

if ""%1""=="""" goto doneSetArgs

set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1

shift

goto setArgs

:doneSetArgs

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

:end

1.该批处理首先去找catalina_home环境变量下的catalina.bat文件,如果该文件不存在,则使用当前目录下的bin/catalina.bat文件。

关于setlocal的含义:运行批处理文件时使用 setlocal 更改环境变量。运行 setlocal 后所做的环境更改是批处理文件的本地更改。Cmd.exe 在遇到 endlocal 命令或者到达批处理文件的结尾时将恢复上一次的设置。

如果EXECUTABLE变量对应的catalina.bat批处理文件存在,则执行该批处理文件,否则报错。这里的批处理使用了shift来遍历我们执行startUp.bat时传入的参数(%1表示第一个参数,取得第一个参数并组装到CMD_LINE_ARGS变量后,shift命令其实相当于shift /1,可以理解这个命令的作用为:去掉现在的第一个参数,后面的参数则向前移一位)

:setArgs

if ""%1""=="""" goto doneSetArgs

set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1

shift

goto setArgs

所以,通过上述代码,循环遍历了所有的命令行参数,组装到CMD_LINE_ARGS中,然后通过call "%EXECUTABLE%" start %CMD_LINE_ARGS%,调用catalina.bat批处理文件,并把命令行参数传递给catalina.bat。

二.catalina.bat批处理文件解析。

@echo off

if "%OS%" == "Windows_NT" setlocal

rem 得到当前目录

set "CURRENT_DIR=%cd%"    

if not "%CATALINA_HOME%" == "" goto gotHome

set "CATALINA_HOME=%CURRENT_DIR%"

if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome

cd ..

set "CATALINA_HOME=%cd%"

cd "%CURRENT_DIR%"

:gotHome

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


rem 校验存在catalina.bat文件之后,执行setenv.bat,优先从CATALINA_BASE环境变量中寻找,如果没有,则在CATALINA_HOME%/bin下寻找setenv.bat并执行,如果都没有找到,则执行

rem %CATALINA_HOME%/bin/setclasspath.bat"文件。

:okHome



set CLASSPATH=


if "%CATALINA_BASE%" == "" goto gotSetenvHome

if exist "%CATALINA_BASE%/bin/setenv.bat" call "%CATALINA_BASE%/bin/setenv.bat"

goto gotSetenvBase

:gotSetenvHome

if exist "%CATALINA_HOME%/bin/setenv.bat" call "%CATALINA_HOME%/bin/setenv.bat"

:gotSetenvBase


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" %1

if errorlevel 1 goto end


if not "%CATALINA_BASE%" == "" goto gotBase

set "CATALINA_BASE=%CATALINA_HOME%"

:gotBase


if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir

set "CATALINA_TMPDIR=%CATALINA_BASE%/temp"

:gotTmpdir


if "%CLASSPATH%" == "" goto emptyClasspath

set "CLASSPATH=%CLASSPATH%;"

:emptyClasspath

if "%CATALINA_BASE%" == "%CATALINA_HOME%" goto juliClasspathHome

if not exist "%CATALINA_BASE%/bin/tomcat-juli.jar" goto juliClasspathHome

set "CLASSPATH=%CLASSPATH%%CATALINA_BASE%/bin/tomcat-juli.jar;%CATALINA_HOME%/bin/bootstrap.jar"

goto juliClasspathDone

:juliClasspathHome

set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%/bin/bootstrap.jar"

:juliClasspathDone


if not "%LOGGING_CONFIG%" == "" goto noJuliConfig

set LOGGING_CONFIG=-Dnop

if not exist "%CATALINA_BASE%/conf/logging.properties" goto noJuliConfig

set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%/conf/logging.properties"

:noJuliConfig

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%


if not "%LOGGING_MANAGER%" == "" goto noJuliManager

set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

:noJuliManager

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%


rem ----- Execute The Requested Command ---------------------------------------


echo Using CATALINA_BASE:   "%CATALINA_BASE%"

echo Using CATALINA_HOME:   "%CATALINA_HOME%"

echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"

if ""%1"" == ""debug"" goto use_jdk

echo Using JRE_HOME:        "%JRE_HOME%"

goto java_dir_displayed

:use_jdk

echo Using JAVA_HOME:       "%JAVA_HOME%"

:java_dir_displayed

echo Using CLASSPATH:       "%CLASSPATH%"


set _EXECJAVA=%_RUNJAVA%

set MAINCLASS=org.apache.catalina.startup.Bootstrap

set ACTION=start

set SECURITY_POLICY_FILE=

set DEBUG_OPTS=

set JPDA=


if not ""%1"" == ""jpda"" goto noJpda

set JPDA=jpda

if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport

set JPDA_TRANSPORT=dt_socket

:gotJpdaTransport

if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress

set JPDA_ADDRESS=8000

:gotJpdaAddress

if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend

set JPDA_SUSPEND=n

:gotJpdaSuspend

if not "%JPDA_OPTS%" == "" goto gotJpdaOpts

set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

:gotJpdaOpts

shift

:noJpda


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


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


:doDebug

shift

set _EXECJAVA=%_RUNJDB%

set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%/../../java"

rem 如果有参数中有-security

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


:doStart

shift

if not "%OS%" == "Windows_NT" goto noTitle

if "%TITLE%" == "" set TITLE=Tomcat

set _EXECJAVA=start "%TITLE%" %_RUNJAVA%

goto gotTitle

:noTitle

set _EXECJAVA=start %_RUNJAVA%

:gotTitle

if not ""%1"" == ""-security"" goto execCmd

shift

echo Using Security Manager

set "SECURITY_POLICY_FILE=%CATALINA_BASE%/conf/catalina.policy"

goto execCmd


:doStop

shift

set ACTION=stop

set CATALINA_OPTS=

goto execCmd


:doVersion

%_EXECJAVA% -classpath "%CATALINA_HOME%/lib/catalina.jar" org.apache.catalina.util.ServerInfo

goto end



:execCmd

rem Get remaining unshifted command line arguments and save them in the CMD_LINE_ARGS properties

set CMD_LINE_ARGS=

:setArgs

if ""%1""=="""" goto doneSetArgs

set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1

shift

goto setArgs

:doneSetArgs


rem Execute Java with the applicable properties

if not "%JPDA%" == "" goto doJpda

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity

%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end

:doSecurity

%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end

:doJpda

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda

%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end

:doSecurityJpda

%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end


:end


正常情况执行的是start模式,效果和call catalina.bat start命令一样 ,最终执行的命令为:

start "Tomcat" "C:/Program Files/Java/jdk1.6.0_10/bin/java"  -Djava.util.logging.config.file="D:/osv/tomcat6/output/build/conf/logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager   -Djava.endorsed.dirs="D:/osv/tomcat6/output/build/endorsed" -classpath "D:/osv/tomcat6/output/build/bin/bootstrap.jar" -Dcatalina.base="D:/osv/tomcat6/output/build" -Dcatalina.home="D:/osv/tomcat6/output/build" -Djava.io.tmpdir="D:/osv/tomcat6/output/build/temp" org.apache.catalina.startup.Bootstrap  start

以下的输出表明了执行该批处理可以指定的参数:

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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值