设为首页 收藏本站
查看: 1001|回复: 0

[经验分享] 查看tomcat启动文件都干点啥

[复制链接]

尚未签到

发表于 2018-12-7 07:41:12 | 显示全部楼层 |阅读模式
  以下所写的都是基于Windows 操作系统,tomcat7.0版本。一直在使用tomcat但是老实说对于tomcat本身并没有一个系统的掌握,今天饶有兴致的随便看了看,做了一点笔记,写一点心得,我本人比较喜欢从表面出发,从使用出发,然后再深入到它的本质问题上。
  在windows操作系统中,我们运行tomcat只需要执行startup.bat脚本就好,简单的很,但是startup.bat这个脚本做些什么,我是真的不知道的,所以今天我就说说startup.bat这个脚本都有什么内幕在里面。首先我们看一下startup.bat的内容是什么:
1 @echo off   2 rem Licensed to the Apache Software Foundation (ASF) under one or more   3 rem contributor license agreements.  See the NOTICE file distributed with   4 rem this work for additional information regarding copyright ownership.   5 rem The ASF licenses this file to You under the Apache License, Version 2.0   6 rem (the "License"); you may not use this file except in compliance with   7 rem the License.  You may obtain a copy of the License at   8 rem   9 rem     http://www.apache.org/licenses/LICENSE-2.0  10 rem  11 rem Unless required by applicable law or agreed to in writing, software  12 rem distributed under the License is distributed on an "AS IS" BASIS,  13 rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  14 rem See the License for the specific language governing permissions and  15 rem limitations under the License.  16   17 if "%OS%" == "Windows_NT" setlocal  18 rem ---------------------------------------------------------------------------  19 rem Start script for the CATALINA Server  20 rem  21 rem $Id: startup.bat 895392 2010-01-03 14:02:31Z kkolinko $  22 rem ---------------------------------------------------------------------------  23   24 rem Guess CATALINA_HOME if not defined  25 set "CURRENT_DIR=%cd%"  26 if not "%CATALINA_HOME%" == "" goto gotHome  27 set "CATALINA_HOME=%CURRENT_DIR%"  28 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome  29 cd ..  30 set "CATALINA_HOME=%cd%"  31 cd "%CURRENT_DIR%"  32 :gotHome  33 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome  34 echo The CATALINA_HOME environment variable is not defined correctly  35 echo This environment variable is needed to run this program  36 goto end  37 :okHome  38   39 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"  40   41 rem Check that target executable exists  42 if exist "%EXECUTABLE%" goto okExec  43 echo Cannot find "%EXECUTABLE%"  44 echo This file is needed to run this program  45 goto end  46 :okExec  47   48 rem Get remaining unshifted command line arguments and save them in the  49 set CMD_LINE_ARGS=  50 :setArgs  51 if ""%1""=="""" goto doneSetArgs  52 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1  53 shift  54 goto setArgs  55 :doneSetArgs  56   57 call "%EXECUTABLE%" start %CMD_LINE_ARGS%  58   59 :end  
  如果熟悉语法,那么对这个脚本的内容了解起来就很容易,不幸的是,我不熟悉,所以我只能一点一点的看了,从头开始:
  第1行:echo off是一个批处理命令,作用就是关闭输出所执行的批处理操作的所执行的命令,前面加上@就是连echo off这条命令也不显示,看一下下面这个例子,我在D盘创建一个脚本文件test.bat,文件中的内容如下:
1 C:  2 dir  
  我运行此脚本,执行结果如下:

  当在test.bat脚本上加上echo off以后,
1 echo off  2 c:  3 dir  
  执行结果 如下:

  有没有发现,其中的c:和dir命令都已经不现实了,知识现实了一个echo off命令,如果加上@echo off那么连echo off命令都不现实:
@echo off  c:  dir  
  执行结果如下:

  发现所有执行的命令都没有现实,知识输出了命令的执行结果。
  下面看第17行:
if "%OS%" == "Windows_NT" setlocal  
  可以判断这是一个判断语句,如果%OS% == "Windows_NT" 那么执行setlocal,这里面有两个不好理解的东西,%OS%为何物,setlocal又是做了什么事情,%%是从操作系统的环境变量中读取信息,我们可以看一下,在操作系统中,应该有个OS环境变量,

  下面我们来尝试一下,同样在test.bat中加入测试内容:
1 @echo off  2 echo %OS%   3 echo %Path%  
  查看执行结果:

  不出意料果然是在读取环境变量中的内容,但是当我把环境变量中的内容作修改以后呢?

  查看执行结果:

  发现此时%OS%已经改变。下来需要看看setlocal这个命令做了些什么操作,下面看一下在microsoft网站上对于setlocal的讲解,setlocal:
Starts localization of environment variables in a batch file. Localization continues until a matching endlocal command is encountered or the end of the batch file is reached.  
  在批处理文件中环境变量的本地化操作。意思就是在setlocal命令执行以后,对于环境变量所做的修改只是对于本批处理文件有影响,这个影响直到对应的endlocal命令,或者批处理文件结尾处时消除。举例子证明一下:
1 @echo off  2 setlocal  3 path=g:\programs\superapp;%path%   4 echo %Path%  5 endlocal  6 echo %Path%  
  如果按照上面的说法,两次输出的%Path%应该不一样,第一次比第二次多输出g:\programs\superapp,下面看结果

  所以if "%OS%" == "Windows_NT" setlocal的意思就是如果在环境变量中%OS%设置的是Windows_NT,那么就调用setlocal方法在本startup.bat这个批处理文件中,设置本地的环境变量。
  下面看第25行
set "CURRENT_DIR=%cd%"  
  这个理解起来可能很简单,问题就是%cd%这个具体是什么值,只需要尝试一下:
@echo off  set "CURRENT_DIR=%cd%"  echo %CURRENT_DIR%  
  其实很简单,%cd%变量就是current_dir的简写,就是批处理文件运行的当前目录,由于startup.bat都运行在tomcat的bin目录下,所有我也将test.bat放到该目录下,在我的环境中,这个地址为,D:\apache-tomcat-7.0.52-src\bin,那么执行结果为:

  下面看25行
  if not "%CATALINA_HOME%" == "" goto gotHome
  如果你习惯在操作系统中设置%CATALINA_HOME%这个环境变量,那么此刻执行到此处的时候,就会跳转到:gotHome节点下的语句中,
@echo off   if not "%CATALINA_HOME%" == "" goto gotHome  echo aaa  :gotHome  echo "gotHome"  
  输出结果:

  但是我平时真的没有设置%CATALINA_HOME%这个环境变量的习惯,所以此处我将刚才添加的%CATALINA_HOME%环境变量去掉,所以在执行
  if not "%CATALINA_HOME%" == ""这条语句的时候,返回的结果为false,所以顺序执行第26行:
  下面看26行的内容:
set "CATALINA_HOME=%CURRENT_DIR%"  
  上面已经知道了%CURRENT_DIR%这个变量时在tomcat\bin目录,在我的环境下应该就是D:\apache-tomcat-7.0.52-src\bin,如何要是设置%CATALINA_HOME%这个变量的话,%CATALINA_HOME%的值应该是tomcat所在的目录。在我的环境下应该就是D:\apache-tomcat-7.0.52-src。
  接下来查看27行的内容:
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome  
  这个意思就是如果存在%CATALINA_HOME%\bin\catalina.bat这个批处理文件,那么就跳转到:okHome节点下面的代码中,如果这个文件不存在那么就顺序执行28行的代码,但是一般情况下,这个文件都是存在的,我也想不出什么情况下(排除人为删除),这个文件不存在,但是还是看一下28-30行的代码:
cd ..  set "CATALINA_HOME=%cd%"  cd "%CURRENT_DIR%"  
  这个意思很明了,以我的环境为例,如果不存在D:\apache-tomcat-7.0.52-src\bin\catalina.bat文件,那么就到D:\apache-tomcat-7.0.52-src这个目录下,此时的%cd%的值应该为D:\apache-tomcat-7.0.52-src,设置CATALINA_HOME变量为D:\apache-tomcat-7.0.52-src,因为前面设置过%CURRENT_DIR%的值为D:\apache-tomcat-7.0.52-src\bin,所以在此进到D:\apache-tomcat-7.0.52-src\bin这个目录下。
  下面是gotHome节点了,看一下gotHome节点的命令:
: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  
  从上面的程序看来,如果设置了%CATALINA_HOME%变量,那么直接跳转到执行gotHome节点,如果没有定义这个变量的话就顺序执行到这来,gotHome主要做的工作就是判断%CATALINA_HOME%\bin\catalina.bat这个文件是不是存在,如果存在,那么到:okHome节点,如果不存在,那么输出错误信息,然后直接跳转到文件的末尾处,结束本次程序。下面请看cataline.bat文件存在的情况下,执行的:okHome节点的信息:
: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  
  :ok节点的操作同样只是做了一下校验,把%CATALINA_HOME%\bin\catalina.bat赋值给变量EXECUTABLE,然后再做一次EXECUTABLE变量的校验,同样,如果校验成功的话,执行:okExec节点下的操作,如果不存在,输出相关的错误信息,然后直接跳转到文件的末尾处,结束本次执行。接下来的部分,不能分开说明,所以把45-53行拿出来一起说明:
: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  
  将:setArgs节点下的返回结果赋值给CMD_LINE_ARGS变量。在:setArgs的第一条命令,如果%1也就是第一个参数为空,那么直接跳转到:doneSetArgs节点,执行catalina.bat文件,此时应该没有传递参数。如果存在参数的话,那么就循环所有的参数,将所有的参数链接在一起,赋值给CMD_LINE_ARGS变量,然后执行catalina.bat文件,此时应该有传递参数。
  到此关于tomcat在windows操作系统下的的启动文件startup.bat的分析就结束了,其实startup.bat文件的作用就是找到catalina.bat文件,然后把参数传递给它,至于catalina.bat文件都做了什么操作,等下一章在分析把。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-644128-1-1.html 上篇帖子: Tomcat自动部署(洛晨的技术日记) 下篇帖子: linux+tomcat+oracle_第三步
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表