Catalina.bat是tomcat所有腳本中最重要的腳本,完成幾乎所有的tomcat操作。如啟動,關閉等等,都是由catalina.bat腳本來完成的。接下來,我將對Tomcat?catalina.bat腳本進行分析。
????首先省去catalina.bat開頭諸多注解,這些注解主要是講解各個變量是干什么的。需要的話,自己看下英文就可以了。這里就不翻譯了。
rem?Guess?CATALINA_HOME?if?not?defined??查看是否在tomcat目錄下,與startup.bat里相同,不解釋了。需要的話可以看我的另一篇博客。
set?CURRENT_DIR=%cd%
if?not?"%CATALINA_HOME%"?==?""?goto?gotHome
set?CATALINA_HOME=%CURRENT_DIR%
if?exist?"%CATALINA_HOME%\bin\catalina.bat"?goto?okHome
cd?..
set?CATALINA_HOME=%cd%
cd?%CURRENT_DIR%
: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
:okHome
rem?Get?standard?environment?variables
if?exist?"%CATALINA_HOME%\bin\setenv.bat"?call?"%CATALINA_HOME%\bin\setenv.bat"?如果存在setenv.bat腳本,調用它,我的tomcat?沒有這個腳本
rem?Get?standard?Java?environment?variables
if?exist?"%CATALINA_HOME%\bin\setclasspath.bat"?goto?okSetclasspath?查看是否存在setclasspath.bat腳本,如果存在,轉到okSetclasspath位置
echo?Cannot?find?%CATALINA_HOME%\bin\setclasspath.bat?否則輸出下面兩行,并退出
echo?This?file?is?needed?to?run?this?program
goto?end
:okSetclasspath????okSetclasspath位置
set?BASEDIR=%CATALINA_HOME%???設定BASEDIR變量與CATALINA_HOME變量值相同
call?"%CATALINA_HOME%\bin\setclasspath.bat"?%1???調用setclasspath.bat腳本并加上參數
if?errorlevel?1?goto?end??????如果存在錯誤?退出
rem?Add?on?extra?jar?files?to?CLASSPATH???設定JSSE_HOME變量,如果存在加入CLASSPATH,不存在跳過
if?"%JSSE_HOME%"?==?""?goto?noJsse????檢查是否存在JSSE_HOME變量
set?CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar?如果有加入到CLASSPATH變量后面
:noJsse??????????????????????????????????
set?CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar??將bootstrap.jar加入到CLASSPATH里
if?not?"%CATALINA_BASE%"?==?""?goto?gotBase??如果CATALINA_BASE變量不為空,跳過,轉到gotBase位置
set?CATALINA_BASE=%CATALINA_HOME%??如果為空,將CATALINA_BASE設為CATALINA_HOME變量的值
:gotBase
if?not?"%CATALINA_TMPDIR%"?==?""?goto?gotTmpdir???CATALINA_TMPDIR不為空,跳過,轉到gotTmpdir位置
set?CATALINA_TMPDIR=%CATALINA_BASE%\temp???如果為空,將?CATALINA_TMPDIR設為%CATALINA_BASE%\temp變量的值(即tomcat\temp)
:gotTmpdir
if?not?exist?"%CATALINA_HOME%\bin\tomcat-juli.jar"?goto?noJuli??如果不存在tomcat-juli.jar這個類,轉到noJuli位置
set?JAVA_OPTS=%JAVA_OPTS%?-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager?-?Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"??如果存在,將變量加入到JAVA_OPTS里set?JAVA_OPTS=%JAVA_OPTS%?-Xms128m?-Xmx512m?-Dfile.encoding=UTF8?-Duser.timezone=GMT?-Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config??設定JAVA_OPTS變量
echo?Using?CATALINA_BASE:???%CATALINA_BASE%?????輸出CATALINA_BASE變量值
echo?Using?CATALINA_HOME:???%CATALINA_HOME%?????輸出CATALINA_HOME變量值
echo?Using?CATALINA_TMPDIR:?%CATALINA_TMPDIR%?輸出CATALINA_TMPDIR變量值
if?""%1""?==?""debug""?goto?use_jdk????????如果變量%1里存在debug?,轉到use_jdk位置
echo?Using?JRE_HOME:????????%JRE_HOME%?????輸出JRE_HOME變量值
goto?java_dir_displayed??????轉到java_dir_displayed
:use_jdk
echo?Using?JAVA_HOME:???????%JAVA_HOME%????輸出JAVA_HOME變量值
:java_dir_displayed
????????????????????????下面幾行設定相應變量
set?_EXECJAVA=%_RUNJAVA%???????
set?MAINCLASS=org.apache.catalina.startup.Bootstrap
set?ACTION=start
set?SECURITY_POLICY_FILE=
set?DEBUG_OPTS=
set?JPDA=
if?not?""%1""?==?""jpda""?goto?noJpda
set?JPDA=jpda
if?not?"%JPDA_TRANSPORT%"?==?""?goto?gotJpdaTransport
set?JPDA_TRANSPORT=dt_shmem
:gotJpdaTransport
if?not?"%JPDA_ADDRESS%"?==?""?goto?gotJpdaAddress
set?JPDA_ADDRESS=jdbconn
:gotJpdaAddress
if?not?"%JPDA_SUSPEND%"?==?""?goto?gotJpdaSuspend
set?JPDA_SUSPEND=n
:gotJpdaSuspend
if?not?"%JPDA_OPTS%"?==?""?goto?gotJpdaOpts
set?JPDA_OPTS=-Xdebug?-Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
:gotJpdaOpts
shift
:noJpda
if?""%1""?==?""debug""?goto?doDebug????如果%1為debug,轉到doDebug,運行debug模式
if?""%1""?==?""run""?goto?doRun????????如果%1為run,轉到doRun,運行正常模式
if?""%1""?==?""start""?goto?doStart????如果%1為start,轉到doStart,啟動tomcat
if?""%1""?==?""stop""?goto?doStop??????如果%1為stop,轉到doStop,關閉tocmat
if?""%1""?==?""version""?goto?doVersion?如果%1為version,轉到doVersion,顯示tomcat的版本號
echo?Usage:??catalina?(?commands?...?)?如果%1沒有上述內容,輸出下面幾行,并結束
echo?commands:
echo???debug?????????????Start?Catalina?in?a?debugger
echo???debug?-security???Debug?Catalina?with?a?security?manager
echo???jpda?start????????Start?Catalina?under?JPDA?debugger
echo???run???????????????Start?Catalina?in?the?current?window
echo???run?-security?????Start?in?the?current?window?with?security?manager
echo???start?????????????Start?Catalina?in?a?separate?window
echo???start?-security???Start?in?a?separate?window?with?security?manager
echo???stop??????????????Stop?Catalina
echo???version???????????What?version?of?tomcat?are?you?running?
goto?end
:doDebug
shift????????????????????將%2里的值轉到%1
set?_EXECJAVA=%_RUNJDB%??將變量?_EXECJAVA設為_RUNJDB變量的值
set?DEBUG_OPTS=-sourcepath?"%CATALINA_HOME%\..\..\jakarta-tomcat-catalina\catalina\src\share"?
設定DEBUG_OPTS變量
if?not?""%1""?==?""-security""?goto?execCmd???
如果%1不為-security,轉到execCmd位置
shift???????將%2里的值轉到%1
echo?Using?Security?Manager???????輸出該行
set?SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
設定SECURITY_POLICY_FILE變量的值
goto?execCmd?????轉到execCmd位置
:doRun
shift????????將%2里的值轉到%1
if?not?""%1""?==?""-security""?goto?execCmd???如果%1不為-security,轉到execCmd位置
shift????????將%2里的值轉到%1
echo?Using?Security?Manager???輸出該行
set?SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
設定SECURITY_POLICY_FILE變量的值
goto?execCmd??轉到execCmd位置
:doStart
shift????????將%2里的值轉到%1
if?not?"%OS%"?==?"Windows_NT"?goto?noTitle??如果OS變量不為Windows_NT,轉到noTitle
set?_EXECJAVA=start?"Tomcat"?%_RUNJAVA%???????設定_EXECJAVA變量的值
goto?gotTitle??????轉到gotTitle位置
:noTitle
set?_EXECJAVA=start?%_RUNJAVA%????設定?_EXECJAVA?變量的值
:gotTitle??????????????
if?not?""%1""?==?""-security""?goto?execCmd???如果%1不為-security,轉到execCmd位置
shift????????????????????將%2里的值轉到%1
echo?Using?Security?Manager????????輸出該行
set?SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy??
設定SECURITY_POLICY_FILE變量的值
goto?execCmd???????轉到execCmd位置
:doStop
shift?????????????????將%2里的值轉到%1
set?ACTION=stop???????將ACTION的變量設為stop
set?CATALINA_OPTS=????設CATALINA_OPTS為空
goto?execCmd??????????轉到execCmd位置
:doVersion????????????顯示tomcat版本號
%_EXECJAVA%?-classpath?"%CATALINA_HOME%\server\lib\catalina.jar"?org.apache.catalina.util.ServerInfo???執行該命令
goto?end??????????????結束該程序
:execCmd??????????
rem?Get?remaining?unshifted?command?line?arguments?and?save?them?in?the
以下幾行將命令參數存入CMD_LINE_ARGS變量中
set?CMD_LINE_ARGS=
:setArgs
if?""%1""==""""?goto?doneSetArgs
set?CMD_LINE_ARGS=%CMD_LINE_ARGS%?%1
shift
goto?setArgs
:doneSetArgs
rem?Execute?Java?with?the?applicable?properties
if?not?"%JPDA%"?==?""?goto?doJpda????????如果JPDA變量不為空,轉到doJpda位置
if?not?"%SECURITY_POLICY_FILE%"?==?""?goto?doSecurity
如果SECURITY_POLICY_FILE變量不為空,轉到doSecurity位置
?如果都沒有執行下面命令,并結束該程序
%_EXECJAVA%?%JAVA_OPTS%?%CATALINA_OPTS%?%DEBUG_OPTS%?-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"?-classpath?"%CLASSPATH%"?-Dcatalina.base="%CATALINA_BASE%"?-Dcatalina.home="%CATALINA_HOME%"?-Djava.io.tmpdir="%CATALINA_TMPDIR%"?%MAINCLASS%?%CMD_LINE_ARGS%?%ACTION%
goto?end
:doSecurity????????執行下面命令,并結束該程序
%_EXECJAVA%?%JAVA_OPTS%?%CATALINA_OPTS%?%DEBUG_OPTS%?-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"?-classpath?"%CLASSPATH%"?-Djava.security.manager?-Djava.security.policy=="%SECURITY_POLICY_FILE%"?-Dcatalina.base="%CATALINA_BASE%"?-Dcatalina.home="%CATALINA_HOME%"?-Djava.io.tmpdir="%CATALINA_TMPDIR%"?%MAINCLASS%?%CMD_LINE_ARGS%?%ACTION%
goto?end
:doJpda??
如果SECURITY_POLICY_FILE變量不為空,轉到doSecurityJpda位置,為空執行下面命令,并結束該程序??
if?not?"%SECURITY_POLICY_FILE%"?==?""?goto?doSecurityJpda
%_EXECJAVA%?%JAVA_OPTS%?%CATALINA_OPTS%?%JPDA_OPTS%?%DEBUG_OPTS%?-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"?-classpath?"%CLASSPATH%"?-Dcatalina.base="%CATALINA_BASE%"?-Dcatalina.home="%CATALINA_HOME%"?-Djava.io.tmpdir="%CATALINA_TMPDIR%"?%MAINCLASS%?%CMD_LINE_ARGS%?%ACTION%
goto?end
:doSecurityJpda??執行下面命令,并結束該程序
%_EXECJAVA%?%JAVA_OPTS%?%CATALINA_OPTS%?%JPDA_OPTS%?%DEBUG_OPTS%?-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"?-classpath?"%CLASSPATH%"?-Djava.security.manager?-Djava.security.policy=="%SECURITY_POLICY_FILE%"?-Dcatalina.base="%CATALINA_BASE%"?-Dcatalina.home="%CATALINA_HOME%"?-Djava.io.tmpdir="%CATALINA_TMPDIR%"?%MAINCLASS%?%CMD_LINE_ARGS%?%ACTION%
goto?end
:end
終結:
???catalina.bat咋一看還以為是什么windows程序,可以雙擊運行,實際上就是調用java命令運行Bootstrap類。從上面代碼可以看出tomcat確實是一個純java的程序,腳本最后都變成直接使用java命令執行程序,與我們普通寫的java程序,沒有什么不同。只不過由于?tomcat可以使用各種眾多的模式(如debug,Security等),以及各種需要各種參數所以不得不使用腳本來執行。
如果你想看看你到底使用了什么命令可以在“if?not?"%SECURITY_POLICY_FILE%"?==?""?goto?doSecurity”這行下面添加兩行。
???????echo??%_EXECJAVA%?%JAVA_OPTS%?%CATALINA_OPTS%?%DEBUG_OPTS%?-Djava.endorsed.dir?....(下面那段,是一行但太長,折行了)
???????pause
???第一行的命令是打印這具話,系統會將%?%里面的變量提換成找到的值并輸出。第二行是暫停程序,你可以通過任意鍵來恢復運行。
???下面是我的程序打印的結果:
start?"Tomcat"?"C:\Program?Files\Java\jdk1.6.0_01\bin\java"??-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager?-Djava.util.logging.config.file="C:\work\tomcat\conf\logging.properties"?-Xms128m?-Xmx512m?-Dfile.encoding=UTF8?-Duser.timezone=GMT?-Djava.security.auth.login.config=C:\work\tomcat/conf/jaas.config???-Djava.endorsed.dirs="C:\work\tomcat\common\endorsed"?-classpath?"C:\Program?Files\Java\jdk1.6.0_01\lib\tools.jar;C:\work\tomcat\bin\bootstrap.jar"?-Dcatalina.base="C:\work\tomcat"?-Dcatalina.home="C:\work\tomcat"?-Djava.io.tmpdir="C:\work\tomcat\temp"?org.apache.catalina.startup.Bootstrap??start
????start?"tomcat"是另開一個窗口,窗口名是tomcat的意思,你可以去掉這部分,完將你程序打印的拷貝到命令行下,點回車,看是不是一樣運行?tomcat了。Catalina.bat?startup實際時就將各種系統變量加以總結,輸出成這個命令。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
