以下所寫的都是基于Windows 操作系統,tomcat7.0版本。一直在使用tomcat但是老實說對于tomcat本身并沒有一個系統的掌握,今天饒有興致的隨便看了看,做了一點筆記,寫一點心得,我本人比較喜歡從表面出發,從使用出發,然后再深入到它的本質問題上。
在windows操作系統中,我們運行tomcat只需要執行startup.bat腳本就好,簡單的很,但是startup.bat這個腳本做些什么,我是真的不知道的,所以今天我就說說startup.bat這個腳本都有什么內幕在里面。首先我們看一下startup.bat的內容是什么:
如果熟悉語法,那么對這個腳本的內容了解起來就很容易,不幸的是,我不熟悉,所以我只能一點一點的看了,從頭開始:
第1行:echo off是一個批處理命令,作用就是關閉輸出所執行的批處理操作的所執行的命令,前面加上@就是連echo off這條命令也不顯示,看一下下面這個例子,我在D盤創建一個腳本文件test.bat,文件中的內容如下:
我運行此腳本,執行結果如下:
當在test.bat腳本上加上echo off以后,
執行結果 如下:
有沒有發現,其中的c:和dir命令都已經不現實了,知識現實了一個echo off命令,如果加上@echo off那么連echo off命令都不現實:
執行結果如下:
發現所有執行的命令都沒有現實,知識輸出了命令的執行結果。
下面看第17行:
可以判斷這是一個判斷語句,如果%OS% == 'Windows_NT' 那么執行setlocal,這里面有兩個不好理解的東西,%OS%為何物,setlocal又是做了什么事情,%%是從操作系統的環境變量中讀取信息,我們可以看一下,在操作系統中,應該有個OS環境變量,
下面我們來嘗試一下,同樣在test.bat中加入測試內容:
查看執行結果:
不出意料果然是在讀取環境變量中的內容,但是當我把環境變量中的內容作修改以后呢?
查看執行結果:
發現此時%OS%已經改變。下來需要看看setlocal這個命令做了些什么操作,下面看一下在microsoft網站上對于setlocal的講解,setlocal:
在批處理文件中環境變量的本地化操作。意思就是在setlocal命令執行以后,對于環境變量所做的修改只是對于本批處理文件有影響,這個影響直到對應的endlocal命令,或者批處理文件結尾處時消除。舉例子證明一下:
如果按照上面的說法,兩次輸出的%Path%應該不一樣,第一次比第二次多輸出g:\programs\superapp,下面看結果
所以if '%OS%' == 'Windows_NT' setlocal的意思就是如果在環境變量中%OS%設置的是Windows_NT,那么就調用setlocal方法在本startup.bat這個批處理文件中,設置本地的環境變量。
下面看第25行
這個理解起來可能很簡單,問題就是%cd%這個具體是什么值,只需要嘗試一下:
其實很簡單,%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節點下的語句中,
輸出結果:
但是我平時真的沒有設置%CATALINA_HOME%這個環境變量的習慣,所以此處我將剛才添加的%CATALINA_HOME%環境變量去掉,所以在執行
if not '%CATALINA_HOME%' == ''這條語句的時候,返回的結果為false,所以順序執行第26行:
下面看26行的內容:
上面已經知道了%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行的內容:
這個意思就是如果存在%CATALINA_HOME%\bin\catalina.bat這個批處理文件,那么就跳轉到:okHome節點下面的代碼中,如果這個文件不存在那么就順序執行28行的代碼,但是一般情況下,這個文件都是存在的,我也想不出什么情況下(排除人為刪除),這個文件不存在,但是還是看一下28-30行的代碼:
這個意思很明了,以我的環境為例,如果不存在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節點的命令:
從上面的程序看來,如果設置了%CATALINA_HOME%變量,那么直接跳轉到執行gotHome節點,如果沒有定義這個變量的話就順序執行到這來,gotHome主要做的工作就是判斷%CATALINA_HOME%\bin\catalina.bat這個文件是不是存在,如果存在,那么到:okHome節點,如果不存在,那么輸出錯誤信息,然后直接跳轉到文件的末尾處,結束本次程序。下面請看cataline.bat文件存在的情況下,執行的:okHome節點的信息:
:okHomeset 'EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat'rem Check that target executable existsif exist '%EXECUTABLE%' goto okExececho Cannot find '%EXECUTABLE%'echo This file is needed to run this programgoto end
:ok節點的操作同樣只是做了一下校驗,把%CATALINA_HOME%\bin\catalina.bat賦值給變量EXECUTABLE,然后再做一次EXECUTABLE變量的校驗,同樣,如果校驗成功的話,執行:okExec節點下的操作,如果不存在,輸出相關的錯誤信息,然后直接跳轉到文件的末尾處,結束本次執行。接下來的部分,不能分開說明,所以把45-53行拿出來一起說明:
將:setArgs節點下的返回結果賦值給CMD_LINE_ARGS變量。在:setArgs的第一條命令,如果%1也就是第一個參數為空,那么直接跳轉到:doneSetArgs節點,執行catalina.bat文件,此時應該沒有傳遞參數。如果存在參數的話,那么就循環所有的參數,將所有的參數鏈接在一起,賦值給CMD_LINE_ARGS變量,然后執行catalina.bat文件,此時應該有傳遞參數。
到此關于tomcat在windows操作系統下的的啟動文件startup.bat的分析就結束了,其實startup.bat文件的作用就是找到catalina.bat文件,然后把參數傳遞給它,至于catalina.bat文件都做了什么操作,等下一章在分析把。