Tomcat的启动和关闭

来源

本文摘抄自  <Tomcat内核设计剖析> 一书。

Tomcat的批处理

​ Tomcat的启动、关闭批处理脚本在/bin目录下。

startup.bat

第一部分
setlocal

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
goto end :okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
if exist "%EXECUTABLE%" goto okExec
goto end
:okExec

说明:

1、setlocal : 表示之后所有对环境变量的改变只限于本批处理文件。需要还原设置,可执行 endlocal,未显示执行,会在批处理的最后自动隐试执行endlocal命令。

第二部分

确定了 catalina_home 的值,就已经确定了 catalina.bat。在启动时,会接收参数:

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%

​ //用收集到的 参数作为 调用 catalina.bat 的参数, 传递 start 参数

:end

shutdown.bat

setlocal

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

goto end

:okHome

set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"

if exist "%EXECUTABLE%" goto okExec

goto end

:okExec

set CMD_LINE_ARGS=

:setArgs

if ""%1""=="""" goto doneSetArgs

set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1

shift

goto setArgs

:doneSetArgs

call "%EXECUTABLE%" stop %CMD_LINE_ARGS% // 类似,传递参数 stop 给 catalina.bat

:end

catalina.bat

是Tomcat服务器启动和关闭的核心脚本,最终目的是 组合出一个最终的执行命令。

第一部分

主要目的是按住 Ctrl+C 组合键终止程序时自动确认。

if not ""%1"" == ""run"" goto mainEntry

if "%TEMP%" == "" goto mainEntry

if exist "%TEMP%%~nx0.run" goto mainEntry

if not exist "%TEMP%%~nx0.run" goto mainEntry

call "%~f0" %* <"%TEMP%%~nx0.Y"

set RETVAL=%ERRORLEVEL%

del /Q "%TEMP%%~nx0.Y" >NUL 2>&1

exit /B %RETVAL%

:mainEntry

del /Q "%TEMP%%~nx0.run" >NUL 2>&1

第二部分

​ 用于设置CATALINA_HOME、CATALINA_BASE 两个变量。(再一次设置catalina_home 是为了直接运行这个bat启动)。

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

goto end

:okHome

if not "%CATALINA_BASE%" == "" goto gotBase

set "CATALINA_BASE=%CATALINA_HOME%"

:gotBase

第三部分

​ 用于尝试寻找setenv.bat和setclasspath.bat并执行,然后将Tomcat的启动包bootstrap.jar和日志包tomcat-juli.jar添加到 CLASSPATH 环境变量中。

set CLASSPATH=

if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome

call "%CATALINA_BASE%\bin\setenv.bat"

goto setenvDone

:checkSetenvHome

if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"

:setenvDone

if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath

goto end

:okSetclasspath

call "%CATALINA_HOME%\bin\setclasspath.bat" %1

if errorlevel 1 goto end

if "%CLASSPATH%" == "" goto emptyClasspath

set "CLASSPATH=%CLASSPATH%;"

:emptyClasspath

set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"

if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir

set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"

:gotTmpdir

if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome

set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"

goto juliClasspathDone

:juliClasspathHome

set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"

:juliClasspathDone

第四部分

​ 对日志配置的设置。

if not "%LOGGING_CONFIG%" == "" goto noJuliConfig

set LOGGING_CONFIG=-Dnop

if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig

set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

:noJuliConfig

if not "%LOGGING_MANAGER%" == "" goto noJuliManager

set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

:noJuliManager

第五部分

执行命令前的一些参数的初始化。

set _EXECJAVA=%_RUNJAVA%

set MAINCLASS=org.apache.catalina.startup.Bootstrap

set ACTION=start

set SECURITY_POLICY_FILE=

set DEBUG_OPTS=

set JPDA=

if not ""%1"" == ""jpda"" goto noJpda

set JPDA=jpda

if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport

set JPDA_TRANSPORT=dt_socket

:gotJpdaTransport

if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress

set JPDA_ADDRESS=localhost:8000

:gotJpdaAddress

if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend

set JPDA_SUSPEND=n

:gotJpdaSuspend

if not "%JPDA_OPTS%" == "" goto gotJpdaOpts

set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

:gotJpdaOpts

shift

:noJpda

第六部分

根据不同的参数跳转到不同的位置执行不同的命令,为下一步的执行命令做准备。

if ""%1"" == ""debug"" goto doDebug

if ""%1"" == ""run"" goto doRun

if ""%1"" == ""start"" goto doStart

if ""%1"" == ""stop"" goto doStop

if ""%1"" == ""configtest"" goto doConfigTest

if ""%1"" == ""version"" goto doVersion

:doDebug

shift

set _EXECJAVA=%_RUNJDB%

set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%....\java"

if not ""%1"" == ""-security"" goto execCmd

shift

set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"

goto execCmd

:doRun

shift

if not ""%1"" == ""-security"" goto execCmd

shift

echo Using Security Manager

set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"

goto execCmd

:doStart

shift

if "%TITLE%" == "" set TITLE=Tomcat

set _EXECJAVA=start "%TITLE%" %_RUNJAVA%

if not ""%1"" == ""-security"" goto execCmd

shift

set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"

goto execCmd

:doStop

shift

set ACTION=stop

set CATALINA_OPTS=

goto execCmd

:doConfigTest

shift

set ACTION=configtest

set CATALINA_OPTS=

goto execCmd

:doVersion

%_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo

goto end

第七部分

将前面所有脚本运行后组成一个最终的命令并开始执行。

:execCmd

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

if not "%JPDA%" == "" goto doJpda

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity

%EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end

_

:doSecurity

%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end

:doJpda

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda

%EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end

_

:doSecurityJpda

%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

goto end

:end

Tomcat的批处理的更多相关文章

  1. tomcat启动批处理——catalina.bat

    这个批处理才是tomcat服务器启动跟关闭的核心脚本.其中包括....(各种变量),此节将详细讲解这个批处理的逻辑. 先看看第一部分脚本: ****************************** ...

  2. tomcat启动批处理——startup.bat

    从文件命名上看就知道这是一个启动批处理,这个批处理的主要功能就是为了找到另一个批处理catalina.bat,并且执行catalina.bat. 一开始就用if "%OS%" == ...

  3. tomcat启动批处理——setclasspath.bat

    除了上面两个批处理,还有一个比较重要的脚本,即是setclasspath.bat,它主要负责寻找.检查JAVA_HOME和JRE_HOME两个变量. ************************* ...

  4. 75篇关于Tomcat源码和机制的文章

    75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报  分类: tomcat内核(82)  版权声明:本文为 ...

  5. bat批处理完成jdk tomcat的安装

    在完成一个web应用项目后,领导要求做一个配置用的批处理文件,能够自动完成jdk的安装,tomcat的安装,web应用的部署,环境变量的注册,tomcat服务的安装和自动启动 参考了网上很多的类似的批 ...

  6. bat(批处理)命令(tomcat 7.0.75 startup.bat 命令集)

    本文主要介绍tomcat 7.0.75中startup.bat(位置:tomcat目录\bin)中涉及到的bat命令,为tomcat源码研究做准备. startup.bat中涉及到的bat命令如下: ...

  7. Windows server利用批处理脚本判断端口, 启动tomcat

    win server服务器上面的tomcat老是不定时挂掉, 于是利用定时操作脚本判断tomcat80端口是否在运行, 如果运行则放过, 如果down掉就启动tomcat,解决tomcat不定时挂掉导 ...

  8. Windows下tomcat进程监控批处理程序

    在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 ...

  9. JAVA环境变量和TomCat服务器配置

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...

随机推荐

  1. 让div铺满整个空间

    需要用到几个css属性: .content{ width:100%;position: absolute;top: 50px;bottom: 0px;left: } 设置了bottom.top及abs ...

  2. sqlserver查询表字段描述(转)

    原文地址:https://blog.csdn.net/changhong009/article/details/29587063 --快速查看表结构(比较全面的) SELECT CASE WHEN c ...

  3. vue-cli项目打包多个与static文件同级的静态资源目录(copy-webpack-plugin插件的使用)

    场景 业务要求能够直接通过 "域名+/file"的方式访问静态资源的html,然而产品绝对static暴露在url中不好看又不能直接将html放在static中.所以想到了既然st ...

  4. csharp:Microsoft.Ink 手写识别(HandWriting Recognition)

    /* 下載: //Microsoft Windows XP Tablet PC Edition 2005 Recognizer Pack http://www.microsoft.com/zh-cn/ ...

  5. bat中实现代码拷贝到指定目录后启动命令行并更改默认路径

      ### window书写shell脚本,实现判断指定文件是否存在,存在就删除,然后复制新文件到此目录 ``` if exist "G:\test\test2\1.txt" (d ...

  6. js中常见面试问题-笔记

    原文参考https://mp.weixin.qq.com/s/mCVL6qI33XeTg4YGIKt-JQ 1.事件代理给父元素添加事件,利用事件冒泡原理,在根据e.target来获取子元素<u ...

  7. Java 开源博客 Solo 1.4.0 发布 - 简化

    Solo 1.4.0 正式发布了!这个版本主要是简化了配置项,修复了一些缺陷并改进了很多细节体验,感谢一直以来关注和支持我们的朋友! 只需一个命令即可启动(不需要安装数据库.部署容器):也可以通过 w ...

  8. Springboot基础知识

    1.@RestController注解 Spring4之后新加入的注解,@RestController是@ResponseBody和@Controller的组合注解.(返回json需要@Respons ...

  9. apache2 tomat https 变成http的解决方案

    1.apache2   设置 RequestHeader set X-Forwarded-Proto "https" 2.springboot 设置 server.tomcat.p ...

  10. 用两个栈实现队列(C++ 和 Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 a ...