startup.bat 分析–Tomcat的入口脚本
我的Tomcat安装路径是:D:\tomcat-res-project\apache-tomcat-8.5.5-src
starup.bat内容
@echo off
rem Licensed to the Apache Software Foundation (ASF) under one or more
rem contributor license agreements. See the NOTICE file distributed with
rem this work for additional information regarding copyright ownership.
rem The ASF licenses this file to You under the Apache License, Version 2.0
rem (the "License"); you may not use this file except in compliance with
rem the License. You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.
rem ---------------------------------------------------------------------------
rem Start script for the CATALINA Server
rem ---------------------------------------------------------------------------
setlocal
rem Guess CATALINA_HOME if not defined
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"
rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
rem Get remaining unshifted command line arguments and save them in the
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
rem Guess CATALINA_HOME if not defined
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"
这一段主要是设置系统变量CATALINA_HOME.
set “CURRENT_DIR=%cd%”设置CURRENT_DIR为当前目录,由于startup.bat是在D:\tomcat-res-project\apache-tomcat-8.5.5-src\bin下的,所以CURRENT_DIR=D:\tomcat-res-project\apache-tomcat-8.5.5-src\bin
if not “%CATALINA_HOME%” == “” goto gotHome
set “CATALINA_HOME=%CURRENT_DIR%”
如果CATALINA_HOME变量非空跳转到gotHome,否则将CURRENT_DIR 的值赋给CATALINA_HOME,因为我们一般是不设置环境变量CATALINA_HOME,所以if not “%CATALINA_HOME%” == “”一般是返回false的,所以会执行set “CATALINA_HOME=%CURRENT_DIR%”
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
如果存在%CATALINA_HOME%\bin\catalina.bat那么跳转到okHome,因为之前设置过CURRENT_DIR,所以%CATALINA_HOME%\bin\catalina.bat等同于D:\tomcat-res-project\apache-tomcat-8.5.5-src\bin\bin\catalina.bat,因此此判断是返回false的。
接着执行cd..,这很容易理解,就是进入上一层目录,因此此时%cd%为D:\tomcat-res-project\apache-tomcat-8.5.5-src,执行set “CATALINA_HOME=%cd%”之后,CATALINA_HOME的值为D:\tomcat-res-project\apache-tomcat-8.5.5-src
: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"
gotHome判断catalina.bat存在性,不存在就退出脚本
okHome设置变量EXECUTABLE
rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
rem Get remaining unshifted command line arguments and save them in the
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
这一段是判断变量EXECUTABLE的存在性,存在则跳转到okExec,不存在则输出提示信息然后退出脚本
oKExec主要是读取命令参数,空参数则跳转到doneSetArgs,非空参数则保存参数到CMD_LINE_ARGS变量中
doneSetArgs执行EXECUTABLE ,实际是上就是调用catalina.bat并附带start参数或者%CMD_LINE_ARGS%所代表的参数
总的来说startup.bat就是找到catalina.bat并调用它