tomcat的批处理文件

tomcat 的批处理文件都在bin目录,启动程序的jar包也在这个里面,与webapps下的应用隔离了,方便使用类加载器隔离多个应用。

启动文件是startup.bat


setlocal
set "CURRENT_DIR=%cd%"

setlocal是表明之后的所有对环境变量的改变只对这个批处理文件有效,如果要还原原先的设置,可以执行endlocal,如果没有显示执行,则在批处理文件的最后隐式自动执行。

接下来设置临时变量CURRENT_DIR为当前目录

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

如果存在环境变量CATALINA_HOME,则跳到gotHome处。

set "CATALINA_HOME=%CURRENT_DIR%"

没有设置过CATALINA_HOME,则设置为当前目录。

if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..  //进入上级目录
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%" //回到当前目录

这一步,CATALINA_HOME此时还是当前目录,肯定是找不到catalina.bat的,所以退到上级目录,将CATALINA_HOME设为上级目录。

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

如果此时找不到catalina.bat,就结束。
找到了,就接着往下走。

:okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
if exist "%EXECUTABLE%" goto okExec
goto end

将变量EXECUTABLE设为catalina.bat,因为上面已经判断过了,所以这里直接去okExec。

:okExec
set CMD_LINE_ARGS=

初始化CMD_LINE_ARGS参数为空

: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%
:end

调用catalina.bat,并把参数传递给它。


catalina.bat 是tomcat启动和管理的核心脚本
由上面可以知道,第一个参数是start,而不是run,所以直接到mainEntry处执行

setlocal
if not ""%1"" == ""run"" goto mainEntry
if "%TEMP%" == "" goto mainEntry  如果环境变量TEMP为空,则直接跳到main入口
if exist "%TEMP%\%~nx0.run" goto mainEntry 如果环境变量目录下存在catalina.bat.run文件
echo Y>"%TEMP%\%~nx0.run"  将字母Y输入 到文件中
if not exist "%TEMP%\%~nx0.run" goto mainEntry 
echo Y>"%TEMP%\%~nx0.Y"    
call "%~f0" %* <"%TEMP%\%~nx0.Y"  以catlina.bat.Y作为输入执行当前批处理脚本 %*表示所有参数
set RETVAL=%ERRORLEVEL%  把上面执行后的%ERRORLEVEL%复制给RETVAL
del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1  删除catalina.bat,并且不输出执行结果,另外把标准错误输出STDERR重定向到STDOUT
exit /B %RETVAL% 推出批处理脚本,并把RETVAL变量作为返回值

下面的作用主要还是设置CATALINA_HOME和CURRENT_DIR,流程和startup.bat里面的差不多

:mainEntry
del /Q "%TEMP%\%~nx0.run" >NUL 2>&1  //删除临时文件

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

把CATALINA_BASE设置为CATALINA_HOME

:okHome
if not "%CATALINA_BASE%" == "" goto gotBase
set "CATALINA_BASE=%CATALINA_HOME%"

这部分用于寻找setenv.bat脚本,默认的tomcat的bin目录是没用这个的

:baseNoSemicolon
set CLASSPATH=
if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
call "%CATALINA_BASE%\bin\setenv.bat"
goto setenvDone
:checkSetenvHome
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"

因为一般没有setenv.bat,所以直接进入下面的流程,调用setclasspath脚本

:setenvDone
if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
goto end
:okSetclasspath
call "%CATALINA_HOME%\bin\setclasspath.bat" %1

判断是否存在tomcat-juli.jar,一般是有的,所以把它添加到classpath中

if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
goto juliClasspathDone

添加一个启动参数,一般环境变量是没有设置JSSE_OPTS的,所以下面这一行会执行。

if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" 如果设置了,则不使用这里的设置
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"

走到这里,正常情况下,JAVA_OPTS就只有一个属性-Djdk.tls.ephemeralDHKeySize=2048。

下面又追加了一个

set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"

把日志配置添加到启动配置中,tomcat的conf下默认是有这个文件的。

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

这个runjava其实就是java.exe,上面有个bat文件设置过这个变量,启动类是Bootstrap

set _EXECJAVA=%_RUNJAVA%
set MAINCLASS=org.apache.catalina.startup.Bootstrap
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=

设置完后。把控制台的名字设为Tomcat,默认启动都是没有参数的,所以security参数是没有的,直接进入execCmd

:doStart
shift
if "%TITLE%" == "" set TITLE=Tomcat
set _EXECJAVA=start "%TITLE%" %_RUNJAVA% 
# 此时_EXECJAVA值为 stat Tomcat java 
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
goto execCmd

下面就是直接执行了

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_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%
goto end

shutdown.bat用于管理tomcat应用,本身和startup.bat差不多,只是在调用catalina.bat时传递的参数不同,传递的是stop,所以最后走的是stop的流程,其它的都一样。
会调用org.apache.catalina.startup.Bootstrap的stop方法

call "%EXECUTABLE%" stop %CMD_LINE_ARGS%
:doStop
shift
set ACTION=stop
set CATALINA_OPTS=
goto execCmd

猜你喜欢

转载自blog.csdn.net/ljz2016/article/details/84819352