1. 程式人生 > >tomcat的批處理檔案

tomcat的批處理檔案

tomcat 的批處理檔案都在bin目錄,啟動程式的jar包也在這個裡面,與webapps下的應用隔離了,方便使用類載入器隔離多個應用。

啟動檔案是startup.bat


setlocal
set "CURRENT_DIR=%cd%"

setlocal是表明之後的所有對環境變數的改變只對這個批處理檔案有效,如果要還原原先的設定,可以執行endlocal,如果沒有顯示執行,則在批處理檔案的最後隱式自動執行。

接下來設定臨時變數CURRENT_DIR為當前目錄

if not "%CATALINA_HOME%" == "" goto gotHome

如果存在環境變數CATALINA_HOME,則跳到gotHome處。

set "CATALINA_HOME=%CURRENT_DIR%"

沒有設定過CATALINA_HOME,則設定為當前目錄。

if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..  //進入上級目錄
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%" //回到當前目錄

這一步,CATALINA_HOME此時還是當前目錄,肯定是找不到catalina.bat的,所以退到上級目錄,將CATALINA_HOME設為上級目錄。

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.bat,就結束。
找到了,就接著往下走。

:okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
if exist "%EXECUTABLE%" goto okExec
goto end

將變數EXECUTABLE設為catalina.bat,因為上面已經判斷過了,所以這裡直接去okExec。

:okExec
set CMD_LINE_ARGS=

初始化CMD_LINE_ARGS引數為空

:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift  //左移,左移後原先第二個引數就變成了第一個
goto setArgs

判斷第一個引數是否為空,為空則沒有引數。有就新增到CMD_LINE_ARGS中

call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end

呼叫catalina.bat,並把引數傳遞給它。


catalina.bat 是tomcat啟動和管理的核心指令碼
由上面可以知道,第一個引數是start,而不是run,所以直接到mainEntry處執行

setlocal
if not ""%1"" == ""run"" goto mainEntry
if "%TEMP%" == "" goto mainEntry  如果環境變數TEMP為空,則直接跳到main入口
if exist "%TEMP%\%~nx0.run" goto mainEntry 如果環境變數目錄下存在catalina.bat.run檔案
echo Y>"%TEMP%\%~nx0.run"  將字母Y輸入 到檔案中
if not exist "%TEMP%\%~nx0.run" goto mainEntry 
echo Y>"%TEMP%\%~nx0.Y"    
call "%~f0" %* <"%TEMP%\%~nx0.Y"  以catlina.bat.Y作為輸入執行當前批處理指令碼 %*表示所有引數
set RETVAL=%ERRORLEVEL%  把上面執行後的%ERRORLEVEL%複製給RETVAL
del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1  刪除catalina.bat,並且不輸出執行結果,另外把標準錯誤輸出STDERR重定向到STDOUT
exit /B %RETVAL% 推出批處理指令碼,並把RETVAL變數作為返回值

下面的作用主要還是設定CATALINA_HOME和CURRENT_DIR,流程和startup.bat裡面的差不多

:mainEntry
del /Q "%TEMP%\%~nx0.run" >NUL 2>&1  //刪除臨時檔案

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

把CATALINA_BASE設定為CATALINA_HOME

:okHome
if not "%CATALINA_BASE%" == "" goto gotBase
set "CATALINA_BASE=%CATALINA_HOME%"

這部分用於尋找setenv.bat指令碼,預設的tomcat的bin目錄是沒用這個的

:baseNoSemicolon
set CLASSPATH=
if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
call "%CATALINA_BASE%\bin\setenv.bat"
goto setenvDone
:checkSetenvHome
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"

因為一般沒有setenv.bat,所以直接進入下面的流程,呼叫setclasspath指令碼

:setenvDone
if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
goto end
:okSetclasspath
call "%CATALINA_HOME%\bin\setclasspath.bat" %1

判斷是否存在tomcat-juli.jar,一般是有的,所以把它新增到classpath中

if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
goto juliClasspathDone

新增一個啟動引數,一般環境變數是沒有設定JSSE_OPTS的,所以下面這一行會執行。

if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" 如果設定了,則不使用這裡的設定
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"

走到這裡,正常情況下,JAVA_OPTS就只有一個屬性-Djdk.tls.ephemeralDHKeySize=2048。

下面又追加了一個

set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"

把日誌配置新增到啟動配置中,tomcat的conf下預設是有這個檔案的。

if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
set LOGGING_CONFIG=-Dnop
if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
:noJuliConfig
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%"

新增類載入器日誌管理器

if not "%LOGGING_MANAGER%" == "" goto noJuliManager
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
:noJuliManager
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"

這個runjava其實就是java.exe,上面有個bat檔案設定過這個變數,啟動類是Bootstrap

set _EXECJAVA=%_RUNJAVA%
set MAINCLASS=org.apache.catalina.startup.Bootstrap
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=

設定完後。把控制檯的名字設為Tomcat,預設啟動都是沒有引數的,所以security引數是沒有的,直接進入execCmd

:doStart
shift
if "%TITLE%" == "" set TITLE=Tomcat
set _EXECJAVA=start "%TITLE%" %_RUNJAVA% 
# 此時_EXECJAVA值為 stat Tomcat java 
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
goto execCmd

下面就是直接執行了

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end

shutdown.bat用於管理tomcat應用,本身和startup.bat差不多,只是在呼叫catalina.bat時傳遞的引數不同,傳遞的是stop,所以最後走的是stop的流程,其它的都一樣。
會呼叫org.apache.catalina.startup.Bootstrap的stop方法

call "%EXECUTABLE%" stop %CMD_LINE_ARGS%
:doStop
shift
set ACTION=stop
set CATALINA_OPTS=
goto execCmd