概述
Tomcat 的三个最重要的启动脚本:
startup.bat catalina.bat setclasspath.bat上一篇咱们分析了 startup.bat 脚本
这一篇咱们来分析 catalina.bat 脚本.
至于 setclasspath.bat 这个脚本, 相信看完这一篇, 就可以自己看懂这个脚本了.
可以点击下载 [ setclasspath.bat 脚本 ]查看附注释的 setclasspath.bat 脚本
catalina.bat
这个脚本的代码有点多, 就单独弄了一篇展示 catalina.bat 脚本中的内容. 点击 [catalina.bat 脚本 ]下载查看.
下面咱们就按照脚本中的内容一行行的来分析.
@echo offsetlocal
这两个命令可以参考上一篇的文章(解析Tomcat的启动脚本--startup.bat)的解释
第一块脚本代码
rem Suppress Terminate batch job on CTRL+Cif not ""%1"" == ""run"" goto mainEntryif "%TEMP%" == "" goto mainEntryif exist "%TEMP%/%~nx0.run" goto mainEntryecho Y>"%TEMP%/%~nx0.run"if not exist "%TEMP%/%~nx0.run" goto mainEntryecho Y>"%TEMP%/%~nx0.Y"call "%~f0" %* <"%TEMP%/%~nx0.Y"rem Use provided errorlevelset RETVAL=%ERRORLEVEL%del /Q "%TEMP%/%~nx0.Y" >NUL 2>&1exit /B %RETVAL%:mainEntrydel /Q "%TEMP%/%~nx0.run" >NUL 2>&1
脚本的作用
判断用户是否使用
catalina.bat run
来启动 Tomcat 的.
如果用户使用 startup.bat 脚本启动 Tomcat, 那么这段脚本不会被执行.
这段代码看起来很乱, 慢慢分析.
第一行:
注释, 意思就是: 禁止使用 CTRL+C 来终止批处理任务, 也不知道是怎么禁止的.
第二行:
if not ""%1"" == ""run"" goto mainEntry
首先明白这里的这个 "%1" 这个变量代表的是什么? 正常情况下, 这个脚本是被 startup.bat 脚本调用的, 被调用的同时传递了一个 start 参数过来(上一篇分析得出的). 在 批处理命令 中 %1 就表示命令之后的第一个参数, 在这里指的就是 start. 所以 "%1" = start. 如果用户用 catalina.bat run 命令启动 Tomcat 的话, 那么这里的 "%1" = run.
第三行:
if "%TEMP%" == "" goto mainEntry
这里的 %TEMP% 很有可能被认为是 空, 其实这里可以读取到系统的环境变量. 所以, 这里的 %TEMP% 就是系统的环境变量值, 通常装完 windows 系统的话, 系统会自动配置上这个环境变量. 所以这里一般是有值的. 大家可以去系统的环境变量看一下它指向那个目录, 一般就是 C:/Users/用户名/AppData/Local/Temp. 注意: AppData 是一个隐藏目录.
第四行:
if exist "%TEMP%/%~nx0.run" goto mainEntry
这里又出现了一个新的东西 %~nx0 . 在批处理中, 我们知道 %1 表示的是程序之后的第一个参数, 那么 %0 呢? %0 表示这个可执行程序的名称, %~nx0 的话就是程序的名称+扩展名
在这里就是 catalina.bat . 大家可以写一个小脚本(test.bat)验证一下: (我的脚本放在 D 盘下)
脚本内容:
@echo offecho "%~nx0"echo "%1"
执行结果:
PS D:/> ./test.bat Hello"test.bat""Hello"PS D:/>
第五行:
echo Y>"%TEMP%/%~nx0.run"
这段代码很简单, 就是写入字符 Y 到 %TEMP%/catalina.bat.run 文件中.
第六行:
新闻热点
疑难解答