1、 Apache Tomcat的下载和安装
从Apache官网https://tomcat.apache.org/可以下载各种版本的tomcat软件,下载的文件格式可以是zip/tar.gz/exe形式的。
如下图所示,在64位windows中使用tomcat,我们可以下载"64-bit Windows.zip",直接解压缩就可以使用;或者下载"32-bit/64-bit Windows Service Installer",通过exe安装tomcat后使用。
2、 tomcat的bin目录
无论哪种形式获得的tomcat服务器软件,在tomcat的主目录下都有一个bin目录,该bin目录中存在tomcat服务器启动、停止和运行所必须的批处理/SHELL脚本、exe可执行程序和一些jar包。
本文只介绍其中的startup.bat脚本程序,该脚本程序通过调用其他脚本用于启动tomcat服务器。
3、 startup.bat脚本的主要功能
该脚本功能很简单,主要实现两方面的功能:找到catalina.bat脚本,该脚本用于实际启动tomcat服务器;组织参数传递给catalina.bat,调用call该脚本执行。
4、 startup.bat脚本详细执行过程
下面文字删掉了startup.bat脚本文件的英文注释,只保留了脚本中可以实际执行的语句,分析了每一条语句的功能。
另,分析的文字放在了rem注释中。rem注释中多数为汉字,操作系统解释该脚本时有时会和后续行的指令发生勾连,造成脚本执行报错。故,每个rem注释语句的最后添加了一个英文形式的点号,这样脚本能正常执行。
另,下面的脚本在tomcat9.0的startup.bat基础上做了些许修改,确保该脚本不仅仅可以完成tomcat的启动操作,其他如stop操作等都可以正常执行。
------ startup.bat ----
@echo off
rem @echo off从本条命令开始关闭回显,如果是echo off则是从下条命令开始关闭回显.
rem 关闭回显是执行bat文件时,在cmd窗口看不到bat执行的命令,但可以看到输出结果.
rem 打开回显,则执行的命令和输出在cmd窗口都能看到.
rem bat脚本一般第一条指令就是这条.
setlocal
rem 设置局部于setlocal和endlocal之间的变量,没有endlocal就直接到bat文件结尾处.
set "CURRENT_DIR=%cd%"
rem %cd%:脚本执行的当前目录,这里的当前目录有可能和脚本实际所在目录不一致.
rem %~dp0%:脚本文件所在目录,注意,目录的路径为全路径,并且带结尾的\,前者不带\.
rem 上面set语句将脚本执行的当前目录名赋给局部变量CURRENT_DIR.
rem 如果CATALINA_HOME的内容不是空,即变量已经设置好了,则直接跳转,不用再赋值了.
if not "%CATALINA_HOME%" == "" goto gotHome
rem 否则取出变量CURRENT_DIR的值赋给CATALINA_HOME这个环境变量.
set "CATALINA_HOME=%CURRENT_DIR%"
rem 若CATALINA_HOME下面的bin目录下存在catalina.bat文件,则直接跳转,不用再赋值.
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
rem 否则向前退一级目录后将目录名赋给CATALINA_HOME,并转到该目录下.
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
rem 如果找到了catalina.bat,则转到后面执行该批处理文件.
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
rem 否则找不到catalina.bat文件,在cmd窗口回显下面的提示,跳转到end,结束脚本执行.
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的全路径名赋给变量EXECUTABLE
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
rem 如果EXECUTABLE中的全路径名存在,则转到执行程序的位置执行启动程序.
if exist "%EXECUTABLE%" goto okExec
rem 否则如果全路径名不存在,提示不能执行启动程序,跳转到最后end结束脚本执行.
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
rem 设置startup.bat的命令行参数,初始化参数为空.
set CMD_LINE_ARGS=
:setArgs
rem 将startup.bat文件的命令行参数存储在CM_LINE_ARGS中.
rem 如果第一个位置的命令行参数为空,则结束拼装命令行参数.
if ""%1""=="""" goto doneSetArgs
rem 将第一个参数并入命令行参数变量中.
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
rem 命令行参数中参数左移一位,即将第二个参数移到第一个参数的位置.
rem 第三个参数移到第二个参数的位置等等.
shift
rem 跳转到:setArgs处,完成当前参数拼装,当参数为空时跳出setArgs循环.
goto setArgs
:doneSetArgs
rem 执行该startup.bat文件可以有如下的一些参数.
rem C>startup.bat
rem C>startup.bat start
rem C>startup.bat stop
rem C>startup.bat debug
rem C>startup.bat start -security
rem C>startup.bat run
rem C>startup.bat run -security
rem 只运行了startup.bat文件,没有指定命令行参数,默认就当成启动操作.
rem 拼装start参数给批处理程序.
if "%CMD_LINE_ARGS%" == "" set CMD_LINE_ARGS=start
echo 调用catalina.bat的命令:%EXECUTABLE% %CMD_LINE_ARGS%
rem 调用catalina.bat批处理脚本文件
call "%EXECUTABLE%" %CMD_LINE_ARGS%
:end