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 gotHomeset CATALINA_HOME=%CURRENT_DIR%if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomecd ..set CATALINA_HOME=%cd%cd %CURRENT_DIR%:gotHomeif exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programgoto end:okHomerem Get standard environment variablesif exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" 如果存在setenv.bat腳本,調用它,我的tomcat 沒有這個腳本rem Get standard Java environment variablesif 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 programgoto 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變量的值:gotBaseif not "%CATALINA_TMPDIR%" == "" goto gotTmpdir CATALINA_TMPDIR不為空,跳過,轉到gotTmpdir位置set CATALINA_TMPDIR=%CATALINA_BASE%\temp 如果為空,將 CATALINA_TMPDIR設為%CATALINA_BASE%\temp變量的值(即tomcat\temp):gotTmpdirif 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里:noJuliset 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_jdkecho Using JAVA_HOME: %JAVA_HOME% 輸出JAVA_HOME變量值:java_dir_displayed 下面幾行設定相應變量set _EXECJAVA=%_RUNJAVA% set MAINCLASS=org.apache.catalina.startup.Bootstrapset ACTION=startset SECURITY_POLICY_FILE=set DEBUG_OPTS=set JPDA=if not ""%1"" == ""jpda"" goto noJpdaset JPDA=jpdaif not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransportset JPDA_TRANSPORT=dt_shmem:gotJpdaTransportif not "%JPDA_ADDRESS%" == "" goto gotJpdaAddressset JPDA_ADDRESS=jdbconn:gotJpdaAddressif not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspendset JPDA_SUSPEND=n:gotJpdaSuspendif not "%JPDA_OPTS%" == "" goto gotJpdaOptsset JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%:gotJpdaOptsshift:noJpdaif ""%1"" == ""debug"" goto doDebug 如果%1為debug,轉到doDebug,運行debug模式if ""%1"" == ""run"" goto doRun 如果%1為run,轉到doRun,運行正常模式if ""%1"" == ""start"" goto doStart 如果%1為start,轉到doStart,啟動tomcatif ""%1"" == ""stop"" goto doStop 如果%1為stop,轉到doStop,關閉tocmatif ""%1"" == ""version"" goto doVersion 如果%1為version,轉到doVersion,顯示tomcat的版本號echo Usage: catalina ( commands ... ) 如果%1沒有上述內容,輸出下面幾行,并結束echo commands:echo debug Start Catalina in a debuggerecho debug -security Debug Catalina with a security managerecho jpda start Start Catalina under JPDA debuggerecho run Start Catalina in the current windowecho run -security Start in the current window with security managerecho start Start Catalina in a separate windowecho start -security Start in a separate window with security managerecho stop Stop Catalinaecho version What version of tomcat are you running?goto end:doDebugshift 將%2里的值轉到%1set _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里的值轉到%1echo Using Security Manager 輸出該行set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy設定SECURITY_POLICY_FILE變量的值goto execCmd 轉到execCmd位置:doRunshift 將%2里的值轉到%1if not ""%1"" == ""-security"" goto execCmd 如果%1不為-security,轉到execCmd位置shift 將%2里的值轉到%1echo Using Security Manager 輸出該行set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy設定SECURITY_POLICY_FILE變量的值goto execCmd 轉到execCmd位置:doStartshift 將%2里的值轉到%1if not "%OS%" == "Windows_NT" goto noTitle 如果OS變量不為Windows_NT,轉到noTitleset _EXECJAVA=start "Tomcat" %_RUNJAVA% 設定_EXECJAVA變量的值goto gotTitle 轉到gotTitle位置:noTitleset _EXECJAVA=start %_RUNJAVA% 設定 _EXECJAVA 變量的值:gotTitle if not ""%1"" == ""-security"" goto execCmd 如果%1不為-security,轉到execCmd位置shift 將%2里的值轉到%1echo Using Security Manager 輸出該行set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy 設定SECURITY_POLICY_FILE變量的值goto execCmd 轉到execCmd位置:doStopshift 將%2里的值轉到%1set ACTION=stop 將ACTION的變量設為stopset 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=:setArgsif ""%1""=="""" goto doneSetArgsset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1shiftgoto setArgs:doneSetArgsrem Execute Java with the applicable propertiesif 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實際時就將各種系統變量加以總結,輸出成這個命令。 呵呵!
原文來自:http://profects.blog.sohu.com/99409747.html
posted on 2013-04-23 16:55
wilsonyq 閱讀(1576)
評論(0) 編輯 收藏 所屬分類:
Tomcat