查看tomcat启动文件都干点啥

系统 1637 0

  以下所写的都是基于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
      
    

我运行此脚本,执行结果如下:

查看tomcat启动文件都干点啥

当在test.bat脚本上加上echo off以后,

      
        1
      
      
        echo
      
      
        off
      
      
        2
      
      
        c:


      
      
        3
      
      
        dir
      
    

 

执行结果 如下:

查看tomcat启动文件都干点啥

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

      
        @echo
      
      
        off
      
      
        

c:


      
      
        dir
      
    

执行结果如下:

查看tomcat启动文件都干点啥

发现所有执行的命令都没有现实,知识输出了命令的执行结果。

下面看第17行:

      
        if
      
       "%OS%" == "Windows_NT" 
      
        setlocal
      
    

可以判断这是一个判断语句,如果%OS% == "Windows_NT" 那么执行setlocal,这里面有两个不好理解的东西,%OS%为何物,setlocal又是做了什么事情, %% 是从操作系统的环境变量中读取信息,我们可以看一下,在操作系统中,应该有个OS环境变量,

查看tomcat启动文件都干点啥

下面我们来尝试一下,同样在test.bat中加入测试内容:

      
        1
      
      
        @echo
      
      
        off
      
      
        2
      
      
        echo
      
      
         %OS% 


      
      
        3
      
      
        echo
      
       %
      
        Path
      
      %
    

      查看执行结果:

查看tomcat启动文件都干点啥

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

查看tomcat启动文件都干点啥

查看执行结果:

       发现此时%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,下面看结果

查看tomcat启动文件都干点啥

      所以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文件都做了什么操作,等下一章在分析把。

 

 

 

查看tomcat启动文件都干点啥


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论