Tomcat启动过程分析
1.stratup.batp批处理文件
1. 环境监测
CATALINA_HOME:类似于JAVA_HOME的环境变量,其实本质是指的一个文件夹的路径,是tomcat目录中bin目录的上层目录
# 将当前目文件目录绝对路径,赋值给CURRENT_DIR变量
set "CURRENT_DIR = %cd%"
# 如果CATALINA_HOME == "",判断结果为TRUE,这个环境变量对应的值为空串,if not
# ture得到false,这行set "CATALINA_HOME=%CURRENT_DIR%",将CURRENT_DIR值赋
# 值给CATALINA_HOME变量,判断%CATALINA_HOME%\bin\catalina.bat是否存在,
# 若存在跳转okHome,否则反回当前目录上级目录,设置CATALINA_HOME为当前目录
#(strat.bat文件上级目录),进入bin目录,判
# 断"%CATALINA_HOME%\bin\catalina.bat"存在,若存在跳转到:okHome,否则输出
# CATALINA_HOME环境变量错误,这个环境变量在运行程序是被需要,程序退出,否则到跳
# 转到:okHome处执行
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
调用call命令执行bin\catalina.bat,传入参数start
2.catalina.bat批处理文件
1. 再次环境检测
2. 配置检测CATALINA_BASE
CATALINA_BASE就是CATALINA_HOME副本
3. 调用setenv.bat
apache-tomcat-9.0.64中没有这个文件,根据源码来看,这是执行的环境检测,不会出现致命错误,后续分析
3. 调用setclasspath.bat,设置java相关配置
传入引用参数,若果setclasspath.bat缺失会产生致命错误,导致程序退出
1.debug
- 为debug跳转到needJavaHome
如果JAVA_HOMEB变量值为空,报错,程序退出
如果JAVA_HOMEbin目录下缺失java.exe,jdb.exe,javac.exe中的任何一个设置JRE_HOME=JAVA_HOME,跳转到okJava
2.okJava
若JAVA_ENDORSED_DIR环境变量值为空串,判断CATALINA_HOME\endorsed存在,设置JAVA_ENDORSED_DIR=CATALINA_HOME\endorsed,否则跳转:gotEndorseddir处执行,判断_RUNJAVA值为空,设置_RUNJAVA=“%JRE_HOME%\bin\java.exe”,否则跳转到goRunJava
2.其它情况
rem Otherwise either JRE or JDK are fine
if not "%JRE_HOME%" == "" goto gotJreHome
if not "%JAVA_HOME%" == "" goto gotJavaHome
echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
echo At least one of these environment variable is needed to run this program
goto exit
如果JRE_HOME和JAVA_HOME都为配置,报错,程序退出
否则跳转到gotJreHome/gotJavaHome
若只配置了JRE_HOME,跳转gotJreHome,若果JRE_HOME\bin\java.exe,跳转noJreHome
程序报错,退出
若果值配置了JAVA_HOME,跳转到gotJavaHome,设置JRE_HOME=JAVA_HOME,跳转到okJava
上面经过判断,决定是配置java.exe还是jdb.exe,就是执行编译程序还是调试