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