解析Tomcat的启动脚本--startup.bat
概述
我们通常使用Tomcat中的startup.bat来启动Tomcat.但是这其中干了一些什么事呢?
大家都知道一个Java程序需要启动的话,肯定需要main方法,那么这个main方法在哪呢?
Tomcat脚本中又是配置了一些什么参数呢,什么情况下Tomcat会启动失败呢?
带着一些列的疑问我们来分析Tomcat的三个最重要的启动脚本:
- startup.bat
- catalina.bat
- setclasspath.bat
startup.bat脚本
该脚本主要做了以下几件事:
- 设置CATALINA_HOME环境变量的值
- 找到catalina.bat脚本
- 调用catalina.bat脚本,并把参数传过去
贴出简化版本的startup.bat脚本的内容
@echooff rem执行这个命令之后,增加或者改动的环境变量只限于匹配到endlocal命令或者到达文件末尾. setlocal rem假设CATALINA_HOME环境变量没有定义 rem取当前目录的路径值,赋给CURRENT_DIR变量,就是./apache-tomcat-x.x.xx/bin set"CURRENT_DIR=%cd%" rem如果CATALINA_HOME变量值不是""的话,调到gotHome标签处 ifnot"%CATALINA_HOME%"==""gotogotHome rem如果CATALINA_HOME是""的话,设置CATALINA_HOME变量值为当前目录的路径值(./apache-tomcat-x.x.xx/bin) set"CATALINA_HOME=%CURRENT_DIR%" rem判断当前路径下的是否有bin\catalina.bat,也就是./apache-tomcat-x.x.xx/bin/bin/catalina.bat rem如果存在的话,直接调到okHome标签处,显然是不存在的 ifexist"%CATALINA_HOME%\bin\catalina.bat"gotookHome rem不存在的话,CATALINA_HOME取上级目录的值,也就是(./apache-tomcat-x.x.xx/) cd.. set"CATALINA_HOME=%cd%" rem进入CURRENT_DIR(./apache-tomcat-x.x.xx/bin) cd"%CURRENT_DIR%" :gotHome rem通过上面的设置,CATALINA_HOME的值已经是:./apache-tomcat-x.x.xx/ rem所以整理是可以找到catalina.bat脚本的,直接调到okHome标签处 ifexist"%CATALINA_HOME%\bin\catalina.bat"gotookHome echoTheCATALINA_HOMEenvironmentvariableisnotdefinedcorrectly echoThisenvironmentvariableisneededtorunthisprogram gotoend :okHome rem设置EXECUTABLE变量指向为catalina.bat脚本 set"EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" rem检查目标可执行文件(catalina.bat)是否存在,通常情况下是存在的,直接调到okExec标签处 rem如果不存在的话,直接退出.启动Tomcat结束 ifexist"%EXECUTABLE%"gotookExec echoCannotfind"%EXECUTABLE%" echoThisfileisneededtorunthisprogram gotoend :okExec rem获取剩余的没有用shift取出来的命令行参数,并保存它们在CMD_LINE_ARGS setCMD_LINE_ARGS= :setArgs rem如果第一个命令行参数是空的话,跳到doneSetArgs标签处 rem"%1":表示执行命令之后的第一个参数 if""%1""==""""gotodoneSetArgs rem第一个参数不是空的话,拼接到CMD_LINE_ARGS变量 setCMD_LINE_ARGS=%CMD_LINE_ARGS%%1 rem这个命令可以自行百度 shift gotosetArgs :doneSetArgs rem上面设置了EXECUTABLE变量的值是指向了catalina.bat脚本,这个利用call命令执行调用,并把参数传进去 rem接下来,咱们看catalina.bat脚本的内容 rem完整的命令:./apache-tomcat-x.x.xx/bin/catalina.batstart call"%EXECUTABLE%"start%CMD_LINE_ARGS% :end
要想理解脚本中的一些命令,首先来了解一下常用的命令(我们用的Window版的)
- rem:该命令后的代码不会被执行,相当于注释
- @echooff:关闭命令的显示,如果没有设置,执行了哪些命令都会显示出来
- echo:输出后面的内容
- setlocal:执行这个命令之后,增加或者改动的环境变量的作用范围只限于匹配到endlocal命令或者到达文件末尾.
- set:设置一个变量
- :xxx:定义一个标签
- goto:跳转到制定的标签处
- call:执行命令
我们来一行行分析startup.bat脚本
set"CURRENT_DIR=%cd%"
%cd%:表示文件所在的目录的路径
如果我们解压的Tomcat所在的目录为D:/apache-tomcat-x.x.x/.因为startup.bat命令在bin目录下,所以此时%cd%表示的目录是D:/apache-tomcat-x.x.x/bin
ifnot"%CATALINA_HOME%"==""gotogotHome
我们通常情况下不会配置CATALINA_HOME这个环境变量的,所以这里不会调到gotHome标签处.
set"CATALINA_HOME=%CURRENT_DIR%"
直接把当前目录假设为CATALINA_HOME的值
ifexist"%CATALINA_HOME%\bin\catalina.bat"gotookHome
然后通过固定的格式来判断一下是否有catalina.bat脚本,当然这里是肯定不会存在的,因为CATALINA_HOME=D:/apache-tomcat-x.x.x/bin
cd.. set"CATALINA_HOME=%cd%"
因为Tomcat的目录格式是固定的,所以这里直接进入上级目录(cd..),然后设置CATALINA_HOME的值为上级目录(D:/apache-tomcat-x.x.x).
ifexist"%CATALINA_HOME%\bin\catalina.bat"gotookHome echoTheCATALINA_HOMEenvironmentvariableisnotdefinedcorrectly echoThisenvironmentvariableisneededtorunthisprogram gotoend
继续往下看,这里又一次判断了一下catalina.bat在这样的目录结构是是否能找到,如果我们解压完Tomcat后,把startup.bat放在非Tomcat的bin目录下之后,这里是找不到的,就直接gotoend,退出Tomcat的启动.
好了,这里我们直接调到okHome标签处.
:okHome set"EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
好了,这里很简单,设置一个EXECUTABLE变量的值指向catalina.bat脚本.
ifexist"%EXECUTABLE%"gotookExec echoCannotfind"%EXECUTABLE%" echoThisfileisneededtorunthisprogram gotoend
又一次的检查了一下这个脚本是否存在,存在的话,直接调到okExec标签处,可以执行了.
如果没有通过检查的话,依旧退出启动,并打印错误信息.
:okExec setCMD_LINE_ARGS= :setArgs if""%1""==""""gotodoneSetArgs setCMD_LINE_ARGS=%CMD_LINE_ARGS%%1 shift gotosetArgs
先设置了一个CMD_LINE_ARGS变量,并且其值暂且为空
这里出现了一个""%1""=="""",拆开看就是判断"%1"是否等于"".那么"%1"又是什么呢?
这是window批处理的一个语法,表示的是执行命令之后的第一个参数,对于这里,我们并没有传递什么参数,所以这里的"%1"是""(空).
直接跳转到doneSetArgs标签处.
如果不是空的话,就拼在后面呗.
这里这个shift命令意思就是移除一个参数,举个例子就知道了:
@echooff echo"%1" shift echo"%1"
建一个test.bat批处理程序,然后把上面代码复制进去,在cmd中执行并给它两个参数
下面是执行结果,这里大家可以把@echooff去掉再执行,验证一下这个命令的作用
PSD:\>.\testHelloWorld "Hello" "World" PSD:\>
这样,大家应该可以理解了.
继续分析
:doneSetArgs call"%EXECUTABLE%"start%CMD_LINE_ARGS% :end
在上面设置了EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat,所以这里实际上是调用了catalina.bat这个脚本,然后传递一个start参数给它.
如果我们在cmd中运行startup.bat并且后面跟着一些参数的话,这里也一起传递过去了.
这里实际上就是执行了:%CATALINA_HOME%\bin\catalina.batstart
总结
这个脚本还是挺简单的,目的就是找到catalina.bat并调用它.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,下篇继续介绍Tomcat相关知识--《解析Tomcat的启动脚本--catalina.bat》,有兴趣的朋友可以看下