查看tomcat啓動文件都乾點啥

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章