Tomcat7源码分析学习系列之二-----tomcat的真正的启动脚本catalina.bat解析
@echo off
setlocal
rem Suppress Terminate batch job on CTRL+C?
if not ""%1"" == ""run"" goto mainEntry ?rem 命令后第一個參數
if "%TEMP%" == "" goto mainEntry rem TEMP,系統環境變量,Windows操作系統安裝后,系統會自動配置TMEP環境變量
if exist "%TEMP%\%~nx0.run" goto mainEntry ? rem %0表當前可執行文件的名稱,比如catalina.bat 的名稱catalina。%~nx0表示可執行文件+擴展名
echo Y>"%TEMP%\%~nx0.run" rem 把字母Y寫入到%TEMP%\%~nx0.run文件,
if not exist "%TEMP%\%~nx0.run" goto mainEntry
echo Y>"%TEMP%\%~nx0.Y" rem 寫入Y到 %TEMP%\catalina.bat.Y . 如果文件不存在, 則新建一個
call "%~f0" %* <"%TEMP%\%~nx0.Y" ? ? rem %~f0 當前可執行文件的絕對路徑,%* 表示命令傳遞的所有參數,這一行的含義是讀取%TEMP%\catalina.bat.Y的內容作為參數放到catalina.bat 命令最后
rem Use provided errorlevel
set RETVAL=%ERRORLEVEL% ?? ? ? ? rem %ERRORLEVEL%,獲取上一個命令執行后的退出碼
del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1 rem del /Q表示靜默刪除,不會給你任何提示。該行是刪除 %TEMP%\catalina.bat.Y 這個文件,>nNUL 表示重定向輸出到NUL中,什么到看不到。
?rem?2表示錯誤輸出,&1標準輸出
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rem 整行的含義是刪除%TEMP%\catalina.bat.Y ,把錯誤輸出的到標準輸出,在輸出到NUL
exit /B %RETVAL% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rem 程序退出,/B 輸出退出碼。即RETVAL
:mainEntry
del /Q "%TEMP%\%~nx0.run" >NUL 2>&1
rem Guess CATALINA_HOME if not defined
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 Copy CATALINA_BASE from CATALINA_HOME if not defined
if not "%CATALINA_BASE%" == "" goto gotBase
set "CATALINA_BASE=%CATALINA_HOME%"
rem 上面從:mainEntry到此處,主要是設置本地環境變量CATALINA_HOME,和CATALINA_BASE
:gotBase
rem Ensure that any user defined CLASSPATH variables are not used on startup,
rem but allow them to be specified in setenv.bat, in rare case when it is needed.
set CLASSPATH= rem 設置臨時環境變量CLASSPATH
rem Get standard environment variables
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"
:setenvDone
rem 以上6行判斷tomcat中bin目錄是否存在setenv.bat批處理文件,存在則執行該文件。通常是不存在的
rem Get standard Java environment variables
if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
echo This file is needed to run this program
goto end
:okSetclasspath
call "%CATALINA_HOME%\bin\setclasspath.bat" %1
if errorlevel 1 goto end
rem 以上幾行是判斷tomcat中bin目錄是否存在setclasspath.bat批處理文件,存在則執行批處理文件,不存在則提示,并退出啟動tomcat。
rem setclasspath.bat主要是設置jdk相關的環境變量,因為tomcat的需要在java虛擬機上運行。
rem JAVA_HOME,jdk的目錄,JRE_HOME,jre目錄,JAVA_ENDORSED_DIRS = %CATALINA_HOME%\endorsed,_RUNJAVA = %JRE_HOME%\bin\java.exe,_RUNJDB = %JAVA_HOME%\bin\jdb.exe
rem Note that there are no quotes as we do not want to introduce random
rem quotes into the CLASSPATH
if "%CLASSPATH%" == "" goto emptyClasspath
set "CLASSPATH=%CLASSPATH%;"
:emptyClasspath
set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
rem 以上幾行是把tomcat中bin目錄下的bootstrap.jar加入到臨時環境變量CLASSPATH
if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
:gotTmpdir
rem 以上3行是設置環境變量CATALINA_TMPDIR=%CATALINA_BASE%\temp,即在tomcat根目錄下的temp
rem Add tomcat-juli.jar to classpath
rem tomcat-juli.jar can be over-ridden per instance
if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
goto juliClasspathDone
:juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
:juliClasspathDone
rem 以上幾行是把tomcat中bin目錄下的bootstrap.jar加入到臨時環境變量CLASSPATH
if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
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" ? ? ?rem 日志配置文件文娛tomcat中的\conf目錄下
:noJuliConfig
if not "%LOGGING_MANAGER%" == "" goto noJuliManager
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager ? ? ? ? ? ? ? ?rem 日志管理加載類
:noJuliManager
rem 設置環境變量JAVA_OPTS LOGGING_CONFIG LOGGING_MANAGER,這些變量會作為參數追加到執行命令 java的后面,最后部分可以看到
rem ----- Execute The Requested Command ---------------------------------------
echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Using CATALINA_HOME: "%CATALINA_HOME%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
if ""%1"" == ""debug"" goto use_jdk
echo Using JRE_HOME: "%JRE_HOME%"
goto java_dir_displayed
:use_jdk
echo Using JAVA_HOME: "%JAVA_HOME%"
:java_dir_displayed
echo Using CLASSPATH: "%CLASSPATH%"
rem 以上是打印相關環境變量
set _EXECJAVA=%_RUNJAVA% rem 上面定義了_RUNJAVA = %JRE_HOME%\bin\java.exe
set MAINCLASS=org.apache.catalina.startup.Bootstrap rem tomcat啟動類
set ACTION=start rem 執行動作默認為start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=
rem 設置相關環境變量,為啟動tomcat最準備,以上環境變量會作為執行程序java的參數來啟動tomcat
if not ""%1"" == ""jpda"" goto noJpda
set JPDA=jpda
if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
set JPDA_TRANSPORT=dt_socket
:gotJpdaTransport
if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
set JPDA_ADDRESS=8000
:gotJpdaAddress
if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
set JPDA_SUSPEND=n
:gotJpdaSuspend
if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
:gotJpdaOpts
shift
:noJpda
rem 以上是對jpda(java platform debug achitecture)相關參數進行設置。在執行命令catalina.bat jpda時才會進行上面的操作
if ""%1"" == ""debug"" goto doDebug
if ""%1"" == ""run"" goto doRun
if ""%1"" == ""start"" goto doStart
if ""%1"" == ""stop"" goto doStop
if ""%1"" == ""configtest"" goto doConfigTest
if ""%1"" == ""version"" goto doVersion
rem 以上是針對不同的啟動策略,執行不同的腳本
echo Usage: catalina ( commands ... )
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 configtest Run a basic syntax check on server.xml
echo version What version of tomcat are you running?
goto end
:doDebug
shift
set _EXECJAVA=%_RUNJDB%
set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
goto execCmd
:doRun
shift
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
goto execCmd
:doStart
shift
if "%TITLE%" == "" set TITLE=Tomcat
set _EXECJAVA=start "%TITLE%" %_RUNJAVA% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?rem 如果是 startup.bat 腳本啟動或者是直接用catalina.bat start命令啟動的話, 會啟動一個新的 cmd 窗口, 并且把 cmd 的 title 設置為 Tomcat.
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
goto execCmd
:doStop
shift
set ACTION=stop
set CATALINA_OPTS=
goto execCmd
:doConfigTest
shift
set ACTION=configtest
set CATALINA_OPTS=
goto execCmd
:doVersion
%_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo
goto end
:execCmd
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
rem 以上是把執行批處理文件命令后的參數循環加載到CMD_LINE_ARGS中
rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %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% %LOGGING_CONFIG% %LOGGING_MANAGER% %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
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_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
:doSecurityJpda
%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_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
:end
轉載于:https://www.cnblogs.com/lbkxx/p/tomcat_catalina.html
總結
以上是生活随笔為你收集整理的Tomcat7源码分析学习系列之二-----tomcat的真正的启动脚本catalina.bat解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntelliJ IDEA 导入新项目
- 下一篇: Kindle:自动追更之云上之旅