Windows下,Tomcat可以以服务形式启动、停止,也可以执行脚本启动(startup.bat)、停止(shutdown.bat)。执行startup.bat时会调用catalina.bat,catalina.bat脚本又会调用setclasspath.bat进行java class path指定。本文将剖析startup.bat的代码实现。
版本:8.0.36
安装目录:E:\tomcat8
- @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注释。
- rem 关闭回显
- @echo off
-
- rem 开启局部变量
- setlocal
-
- rem 设置CURRENT_DIR为当前目录,本例为e:\tomcat8
- set "CURRENT_DIR=%cd%"
-
- rem 如果CATALINA_HOME非空,执行gotHome
- if not "%CATALINA_HOME%" == "" goto gotHome
-
- rem CATALINA_HOME为空,则设置CATALINA_HOM=CURRENT_DIR,本例为e:\tomcat8
- set "CATALINA_HOME=%CURRENT_DIR%"
-
- rem 如果存在catalina.bat文件,执行okHome
- if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
-
- rem 如果不存在catalina.bat文件,则返回上级目录
- cd ..
-
- rem 变量赋值
- set "CATALINA_HOME=%cd%"
-
- rem 进入CURRENT_DIR目录
- cd "%CURRENT_DIR%"
-
- :gotHome
- rem 如果bat文件存在执行okHome,否则输出错误信息,结束脚本。
- 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
- rem 变量赋值
- set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
-
- rem "%EXECUTABLE%"存在则执行okExec,本例为e:\tomcat8\bin\catalina.bat;不存在则报错并结束脚本
- if exist "%EXECUTABLE%" goto okExec
- echo Cannot find "%EXECUTABLE%"
- echo This file is needed to run this program
- goto end
-
- :okExec
- set CMD_LINE_ARGS=
-
- rem 参数拼接,保留startup.bat传入的参数;
- :setArgs
- if ""%1""=="""" goto doneSetArgs
- set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
- shift
- goto setArgs
- :doneSetArgs
-
- rem 调用catalina.bat start 拼接startup.bat 传入的参数
- rem 如startup.bat arg1 arg2,则catalina.bat start arg1 arg2
- call "%EXECUTABLE%" start %CMD_LINE_ARGS%
- :end
-
整个startup.bat脚本最核心代码就是调用catalina脚本,实际场景类似:
- call E:\tomcat8\bin\catalina.bat start
-