日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

运行startup.bat的启动过程

發(fā)布時(shí)間:2023/12/4 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 运行startup.bat的启动过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

一般啟動(dòng)tomcat都是找到bin目錄下的startup.bat(windows)下或者startup.sh(linux下),所以要研究tomcat的啟動(dòng),startup腳本是避不開的。那么下面就來看一看windows下面的startup.bat。

二、bat文件

要看懂startup.bat,首先得對(duì)bat文件有個(gè)基本的了解。

bat文件是dos下的批處理文件。批處理文件是無(wú)格式的文本文件,這個(gè)文件的每一行都是一條DOS命令。它的文件擴(kuò)展名為 .bat 或 .cmd。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統(tǒng)就會(huì)調(diào)用cmd.exe按照該文件中各個(gè)命令出現(xiàn)的順序來逐個(gè)運(yùn)行它們。使用批處理文件(也被稱為批處理程序或腳本),可以簡(jiǎn)化日常或重復(fù)性任務(wù)。

批處理簡(jiǎn)單語(yǔ)法:

rem: 該命令用于注釋,rem起始的行不會(huì)作為代碼執(zhí)行
pause: 該命令用于暫停正在執(zhí)行的批處理文件,并且提示用戶按鍵,然后程序繼續(xù)執(zhí)行
echo: 該命令用于在dos控制臺(tái)顯示一段文本,相當(dāng)于print,如果想要顯示環(huán)境變量需要在環(huán)境變量前后加上%,例如顯示操作系統(tǒng) echo %OS%
echo off: 該命令可以防止將批處理文件中的具體命令打印出來,而只會(huì)輸出執(zhí)行結(jié)果。
@echo off:該命令與echo off相同,唯一的區(qū)別在于 @echo off不僅會(huì)隱藏具體命令還會(huì)連'echo off'這個(gè)自身命令也隱藏起來。
set: 設(shè)置環(huán)境變量,例如 set A = 100 設(shè)置A變量為100
label: 使用 ':'(冒號(hào))來設(shè)置一個(gè)標(biāo)簽,供給goto命令使用,例如":init"代表一個(gè)init標(biāo)簽。
goto: 該命令使正在執(zhí)行的命令強(qiáng)制跳轉(zhuǎn)到他指定的標(biāo)簽。例如我需要跳轉(zhuǎn)指定A標(biāo)簽下的命令,如下:goto A
not: 該命令用來取反,相當(dāng)于邏輯非。
if: 該命令表示判斷
exist: 該命令通常用來測(cè)試文件是否存在,一般和if一起使用
shift: 該命令用來將參數(shù)后移一位即將%2%賦值給%1%,%3%賦值給%2%,也可以理解為參數(shù)列表左移即刪除現(xiàn)有參數(shù)列表的第一位。
call: 該命令用來調(diào)用另外一條命令。
setLocal: 該命令表示該批處理文件中修改的環(huán)境變量只在本文件中起作用,或者直到endLocal命令出現(xiàn),被修改的環(huán)境變量才恢復(fù)原狀。
start: 重新開啟一個(gè)dos窗口。

可以參考一下這篇博文:

Bat命令學(xué)習(xí)

三、startup.bat

用編輯器打開startup.bat文件,內(nèi)容如下:

 1 @echo off
 2 rem Licensed to the Apache Software Foundation (ASF) under one or more
 3 rem contributor license agreements.  See the NOTICE file distributed with
 4 rem this work for additional information regarding copyright ownership.
 5 rem The ASF licenses this file to You under the Apache License, Version 2.0
 6 rem (the "License"); you may not use this file except in compliance with
 7 rem the License.  You may obtain a copy of the License at
 8 rem
 9 rem     http://www.apache.org/licenses/LICENSE-2.0
10 rem
11 rem Unless required by applicable law or agreed to in writing, software
12 rem distributed under the License is distributed on an "AS IS" BASIS,
13 rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 rem See the License for the specific language governing permissions and
15 rem limitations under the License.
16 
17 rem ---------------------------------------------------------------------------
18 rem Start script for the CATALINA Server
19 rem ---------------------------------------------------------------------------
20 
21 setlocal
22 
23 rem Guess CATALINA_HOME if not defined
24 set "CURRENT_DIR=%cd%"
25 if not "%CATALINA_HOME%" == "" goto gotHome
26 set "CATALINA_HOME=%CURRENT_DIR%"
27 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
28 cd ..
29 set "CATALINA_HOME=%cd%"
30 cd "%CURRENT_DIR%"
31 :gotHome
32 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
33 echo The CATALINA_HOME environment variable is not defined correctly
34 echo This environment variable is needed to run this program
35 goto end
36 :okHome
37 
38 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
39 
40 rem Check that target executable exists
41 if exist "%EXECUTABLE%" goto okExec
42 echo Cannot find "%EXECUTABLE%"
43 echo This file is needed to run this program
44 goto end
45 :okExec
46 
47 rem Get remaining unshifted command line arguments and save them in the
48 set CMD_LINE_ARGS=
49 :setArgs
50 if ""%1""=="""" goto doneSetArgs
51 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
52 shift
53 goto setArgs
54 :doneSetArgs
55 
56 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
57 
58 :end

@echo off,此語(yǔ)句常用于開頭,表示不顯示所有的命令行信息,包括此句。

然后是一大段rem后面的內(nèi)容,是注釋,對(duì)軟件的License做了說明,英文不太好,就不翻譯了。

setlocal,啟動(dòng)批處理文件中環(huán)境變量的本地化,本地化將持續(xù)到出現(xiàn)匹配的endlocal命令或者到達(dá)批處理文件結(jié)尾為止。

下面將批處理文件拆成幾段看:

第一段:判斷CATALINA_HOME是否定義

 1 setlocal
 2 
 3 rem Guess CATALINA_HOME if not defined
 4 set "CURRENT_DIR=%cd%"
 5 if not "%CATALINA_HOME%" == "" goto gotHome
 6 set "CATALINA_HOME=%CURRENT_DIR%"
 7 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 8 cd ..
 9 set "CATALINA_HOME=%cd%"
10 cd "%CURRENT_DIR%"
  1. 設(shè)置變量CURRENT_DIR為當(dāng)前目錄,一般打開的就是tomcat的bin目錄,./apache-tomcat-x.x.xx/bin;

  2. 判斷系統(tǒng)變量CATALINA_HOME是不是空串(一般安裝tomcat時(shí),我們都會(huì)配置CATALINA_HOME環(huán)境變量,不知有沒有印象呢),如果是就跳轉(zhuǎn)到gotHome標(biāo)簽執(zhí)行,假設(shè)CATALINA_HOME環(huán)境變量沒有定義,就繼續(xù)往下;

  3. 設(shè)置CATALINA_HOME為CURRENT_DIR指向的目錄,也就是bin目錄(./apache-tomcat-x.x.xx/bin);

  4. 判斷CATALINA_HOME\bin\catalina.bat文件是否存在,也就是 ./apache-tomcat-x.x.xx/bin/bin/catalina.bat,如果存在就轉(zhuǎn)向okHome標(biāo)簽,顯然是不存在的,所以不會(huì)跳轉(zhuǎn)到okHome,繼續(xù)往下;

  5. 不存在的話,CATALINA_HOME取上級(jí)目錄的值,也就是(./apache-tomcat-x.x.xx/);

  6. 設(shè)置CATALINA_HOME指向當(dāng)前目錄,也就是Tomcat的根目錄;

  7. 進(jìn)入 CURRENT_DIR(./apache-tomcat-x.x.xx/bin);

第二段:執(zhí)行g(shù)otHome標(biāo)簽

1 :gotHome
2 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
3 echo The CATALINA_HOME environment variable is not defined correctly
4 echo This environment variable is needed to run this program
5 goto end

通過上面的設(shè)置,CATALINA_HOME的值已經(jīng)是: ./apache-tomcat-x.x.xx/,這時(shí)判斷./apache-tomcat-x.x.xx/catalina.bat 腳本是否存在,如果不存在,則輸出一些信息結(jié)束,一般這時(shí)是可以找到的,所以跳轉(zhuǎn)到okHome標(biāo)簽處;

第三段:執(zhí)行okHome標(biāo)簽

1 :okHome
2 
3 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"

設(shè)置EXECUTABLE變量指向?yàn)閏atalina.bat腳本;

第四段:再次檢查catalina.bat是否存在

1 rem Check that target executable exists 2 if exist "%EXECUTABLE%" goto okExec 3 echo Cannot find "%EXECUTABLE%" 4 echo This file is needed to run this program 5 goto end

雙重保險(xiǎn)繼續(xù)判斷下EXECUTABLE指向的catalina.bat文件是否存在,不存在就輸出提示信息并且結(jié)束,存在就跳轉(zhuǎn)到okExec標(biāo)簽處:

第五段:

 1 :okExec
 2 
 3 rem Get remaining unshifted command line arguments and save them in the
 4 set CMD_LINE_ARGS=
 5 :setArgs
 6 if ""%1""=="""" goto doneSetArgs
 7 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
 8 shift
 9 goto setArgs
10 :doneSetArgs
11 
12 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
  1. set CMD_LINE_ARGS=表示清空變量CMD_LINE_ARGS;
  2. 執(zhí)行setArgs標(biāo)簽;
  3. 第一個(gè)變量(%1%)為空字符串,那么就跳轉(zhuǎn)到doneSetArgs標(biāo)簽,一般情況下,直接運(yùn)行startup.bat,是沒有傳遞任何參數(shù),所以是跳轉(zhuǎn)到doneSetArgs標(biāo)簽,由此也可以猜想出,如果不是使用雙擊執(zhí)行的話,使用命令行啟動(dòng)startup.bat那么是可以傳遞參數(shù)的;
  4. 跳轉(zhuǎn)到doneSetArgs,調(diào)用EXECUTABLE指向的文件,也就是catalina.bat文件,同時(shí)傳遞start參數(shù),因?yàn)镃MD_LINE_ARGS為空,所以只傳遞了一個(gè)start參數(shù)

**最后:**end標(biāo)簽

1 :end

判斷失敗跳轉(zhuǎn)的標(biāo)簽,是參數(shù)不正確的時(shí)候的結(jié)束標(biāo)志。

四、catalina.bat

如果startup.bat執(zhí)行正確,就等同于運(yùn)行catalina.bat start,進(jìn)入了catalina.bat腳本中,將腳本前面的一大段注釋刪掉了,如下:

  1 setlocal
  2 
  3 rem Suppress Terminate batch job on CTRL+C
  4 if not ""%1"" == ""run"" goto mainEntry
  5 if "%TEMP%" == "" goto mainEntry
  6 if exist "%TEMP%\%~nx0.run" goto mainEntry
  7 echo Y>"%TEMP%\%~nx0.run"
  8 if not exist "%TEMP%\%~nx0.run" goto mainEntry
  9 echo Y>"%TEMP%\%~nx0.Y"
 10 call "%~f0" %* <"%TEMP%\%~nx0.Y"
 11 rem Use provided errorlevel
 12 set RETVAL=%ERRORLEVEL%
 13 del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
 14 exit /B %RETVAL%
 15 :mainEntry
 16 del /Q "%TEMP%\%~nx0.run" >NUL 2>&1
 17 
 18 rem Guess CATALINA_HOME if not defined
 19 set "CURRENT_DIR=%cd%"
 20 if not "%CATALINA_HOME%" == "" goto gotHome
 21 set "CATALINA_HOME=%CURRENT_DIR%"
 22 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 23 cd ..
 24 set "CATALINA_HOME=%cd%"
 25 cd "%CURRENT_DIR%"
 26 :gotHome
 27 
 28 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 29 echo The CATALINA_HOME environment variable is not defined correctly
 30 echo This environment variable is needed to run this program
 31 goto end
 32 :okHome
 33 
 34 rem Copy CATALINA_BASE from CATALINA_HOME if not defined
 35 if not "%CATALINA_BASE%" == "" goto gotBase
 36 set "CATALINA_BASE=%CATALINA_HOME%"
 37 :gotBase
 38 
 39 rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colon
 40 rem as this is used as the separator in the classpath and Java provides no
 41 rem mechanism for escaping if the same character appears in the path. Check this
 42 rem by replacing all occurrences of ';' with '' and checking that neither
 43 rem CATALINA_HOME nor CATALINA_BASE have changed
 44 if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon
 45 echo Using CATALINA_HOME:   "%CATALINA_HOME%"
 46 echo Unable to start as CATALINA_HOME contains a semicolon (;) character
 47 goto end
 48 :homeNoSemicolon
 49 
 50 if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon
 51 echo Using CATALINA_BASE:   "%CATALINA_BASE%"
 52 echo Unable to start as CATALINA_BASE contains a semicolon (;) character
 53 goto end
 54 :baseNoSemicolon
 55 
 56 rem Ensure that any user defined CLASSPATH variables are not used on startup,
 57 rem but allow them to be specified in setenv.bat, in rare case when it is needed.
 58 set CLASSPATH=
 59 
 60 rem Get standard environment variables
 61 if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
 62 call "%CATALINA_BASE%\bin\setenv.bat"
 63 goto setenvDone
 64 :checkSetenvHome
 65 if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
 66 :setenvDone
 67 
 68 rem Get standard Java environment variables
 69 if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
 70 echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
 71 echo This file is needed to run this program
 72 goto end
 73 :okSetclasspath
 74 call "%CATALINA_HOME%\bin\setclasspath.bat" %1
 75 if errorlevel 1 goto end
 76 
 77 rem Add on extra jar file to CLASSPATH
 78 rem Note that there are no quotes as we do not want to introduce random
 79 rem quotes into the CLASSPATH
 80 if "%CLASSPATH%" == "" goto emptyClasspath
 81 set "CLASSPATH=%CLASSPATH%;"
 82 :emptyClasspath
 83 set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
 84 
 85 if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
 86 set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
 87 :gotTmpdir
 88 
 89 rem Add tomcat-juli.jar to classpath
 90 rem tomcat-juli.jar can be over-ridden per instance
 91 if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
 92 set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
 93 goto juliClasspathDone
 94 :juliClasspathHome
 95 set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
 96 :juliClasspathDone
 97 
 98 if not "%JSSE_OPTS%" == "" goto gotJsseOpts
 99 set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
100 :gotJsseOpts
101 set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
102 
103 rem Register custom URL handlers
104 rem Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
105 set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
106 
107 if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
108 set LOGGING_CONFIG=-Dnop
109 if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
110 set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
111 :noJuliConfig
112 
113 if not "%LOGGING_MANAGER%" == "" goto noJuliManager
114 set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
115 :noJuliManager
116 
117 rem Configure JAVA 9 specific start-up parameters
118 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.lang=ALL-UNNAMED"
119 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.io=ALL-UNNAMED"
120 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"
121 
122 rem Java 9 no longer supports the java.endorsed.dirs
123 rem system property. Only try to use it if
124 rem JAVA_ENDORSED_DIRS was explicitly set
125 rem or CATALINA_HOME/endorsed exists.
126 set ENDORSED_PROP=ignore.endorsed.dirs
127 if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar
128 set ENDORSED_PROP=java.endorsed.dirs
129 goto doneEndorsed
130 :noEndorsedVar
131 if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed
132 set ENDORSED_PROP=java.endorsed.dirs
133 :doneEndorsed
134 
135 rem ----- Execute The Requested Command ---------------------------------------
136 
137 echo Using CATALINA_BASE:   "%CATALINA_BASE%"
138 echo Using CATALINA_HOME:   "%CATALINA_HOME%"
139 echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
140 if ""%1"" == ""debug"" goto use_jdk
141 echo Using JRE_HOME:        "%JRE_HOME%"
142 goto java_dir_displayed
143 :use_jdk
144 echo Using JAVA_HOME:       "%JAVA_HOME%"
145 :java_dir_displayed
146 echo Using CLASSPATH:       "%CLASSPATH%"
147 
148 set _EXECJAVA=%_RUNJAVA%
149 set MAINCLASS=org.apache.catalina.startup.Bootstrap
150 set ACTION=start
151 set SECURITY_POLICY_FILE=
152 set DEBUG_OPTS=
153 set JPDA=
154 
155 if not ""%1"" == ""jpda"" goto noJpda
156 set JPDA=jpda
157 if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
158 set JPDA_TRANSPORT=dt_socket
159 :gotJpdaTransport
160 if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
161 set JPDA_ADDRESS=localhost:8000
162 :gotJpdaAddress
163 if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
164 set JPDA_SUSPEND=n
165 :gotJpdaSuspend
166 if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
167 set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
168 :gotJpdaOpts
169 shift
170 :noJpda
171 
172 if ""%1"" == ""debug"" goto doDebug
173 if ""%1"" == ""run"" goto doRun
174 if ""%1"" == ""start"" goto doStart
175 if ""%1"" == ""stop"" goto doStop
176 if ""%1"" == ""configtest"" goto doConfigTest
177 if ""%1"" == ""version"" goto doVersion
178 
179 echo Usage:  catalina ( commands ... )
180 echo commands:
181 echo   debug             Start Catalina in a debugger
182 echo   debug -security   Debug Catalina with a security manager
183 echo   jpda start        Start Catalina under JPDA debugger
184 echo   run               Start Catalina in the current window
185 echo   run -security     Start in the current window with security manager
186 echo   start             Start Catalina in a separate window
187 echo   start -security   Start in a separate window with security manager
188 echo   stop              Stop Catalina
189 echo   configtest        Run a basic syntax check on server.xml
190 echo   version           What version of tomcat are you running?
191 goto end
192 
193 :doDebug
194 shift
195 set _EXECJAVA=%_RUNJDB%
196 set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"
197 if not ""%1"" == ""-security"" goto execCmd
198 shift
199 echo Using Security Manager
200 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
201 goto execCmd
202 
203 :doRun
204 shift
205 if not ""%1"" == ""-security"" goto execCmd
206 shift
207 echo Using Security Manager
208 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
209 goto execCmd
210 
211 :doStart
212 shift
213 if "%TITLE%" == "" set TITLE=Tomcat
214 set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
215 if not ""%1"" == ""-security"" goto execCmd
216 shift
217 echo Using Security Manager
218 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
219 goto execCmd
220 
221 :doStop
222 shift
223 set ACTION=stop
224 set CATALINA_OPTS=
225 goto execCmd
226 
227 :doConfigTest
228 shift
229 set ACTION=configtest
230 set CATALINA_OPTS=
231 goto execCmd
232 
233 :doVersion
234 %_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo
235 goto end
236 
237 
238 :execCmd
239 rem Get remaining unshifted command line arguments and save them in the
240 set CMD_LINE_ARGS=
241 :setArgs
242 if ""%1""=="""" goto doneSetArgs
243 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
244 shift
245 goto setArgs
246 :doneSetArgs
247 
248 rem Execute Java with the applicable properties
249 if not "%JPDA%" == "" goto doJpda
250 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
251 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
252 goto end
253 :doSecurity
254 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%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%
255 goto end
256 :doJpda
257 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
258 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
259 goto end
260 :doSecurityJpda
261 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%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%
262 goto end
263 
264 :end

第一段:

 1 rem Suppress Terminate batch job on CTRL+C
 2 if not ""%1"" == ""run"" goto mainEntry
 3 if "%TEMP%" == "" goto mainEntry
 4 if exist "%TEMP%\%~nx0.run" goto mainEntry
 5 echo Y>"%TEMP%\%~nx0.run"
 6 if not exist "%TEMP%\%~nx0.run" goto mainEntry
 7 echo Y>"%TEMP%\%~nx0.Y"
 8 call "%~f0" %* <"%TEMP%\%~nx0.Y"
 9 rem Use provided errorlevel
10 set RETVAL=%ERRORLEVEL%
11 del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
12 exit /B %RETVAL%
13 :mainEntry
14 del /Q "%TEMP%\%~nx0.run" >NUL 2>&1
  1. 首先注釋是說,禁止使用 CTRL+C 來終止批處理任務(wù);

  2. if not ""%1"" == ""run"" goto mainEntry,第一個(gè)參數(shù)不是run,就轉(zhuǎn)向mainEntry標(biāo)簽,通過調(diào)用startup.bat啟動(dòng)的第一個(gè)參數(shù)應(yīng)該是start;

  3. if "%TEMP%" == "" goto mainEntry,%TEMP%是系統(tǒng)的環(huán)境變量值,通常裝完windows系統(tǒng)的話, 系統(tǒng)會(huì)自動(dòng)配置上這個(gè)環(huán)境變量,一般是C:\Users\用戶名\AppData\Local\Temp(AppData是一個(gè)隱藏文件夾)。這句是說,如果%TEMP%是空串,就轉(zhuǎn)向mainEntry標(biāo)簽;

  4. if exist "%TEMP%\%~nx0.run" goto mainEntry, 在批處理中,%1 表示的是程序之后的第一個(gè)參數(shù),%0表示這個(gè)可執(zhí)行程序的名稱, %~nx0 的話就是程序的名稱+擴(kuò)展名,在這里就是catalina.bat(可以寫一個(gè)腳本測(cè)試下);

  5. echo Y>"%TEMP%\%~nx0.run",寫入字符Y到%TEMP%\catalina.bat.run 文件中;

  6. if not exist "%TEMP%\%~nx0.run" goto mainEntry,又判斷了一下 %TEMP%\catalina.bat.run 文件是否存在;

  7. echo Y>"%TEMP%\%~nx0.Y",寫入Y到%TEMP%\catalina.bat.Y,如果文件不存在, 則新建一個(gè);

  8. call "%~f0" %* <"%TEMP%\%~nx0.Y",- “%~f0” : 簡(jiǎn)單說就是表示當(dāng)前命令的絕對(duì)路徑。- “%” : %1表示第一個(gè)參數(shù),%2表示第二個(gè),%代表所有參數(shù)。<”%TEMP%\%~nx0.Y”是讀取 %TEMP%\catalina.bat.Y文件中的內(nèi)容,之后又通過call進(jìn)行調(diào)用;

  9. set RETVAL=%ERRORLEVEL%,Windows中和linux一樣,命令執(zhí)行完之后都有自己的退出碼,%ERRORLEVEL%就是取的上面的call 命令的退出碼,賦值給一個(gè)變量RETVAL;

  10. del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1,del 命令,很容易聯(lián)想到delete, 那么/Q是什么意思呢?靜默刪除,不會(huì)給出任何提示,就比如Linux中的rm -f 一樣。這里是刪除%TEMP%\catalina.bat.Y這個(gè)文件。后面的 >NUL 2>&1又是什么意思呢? >NUL : 表示將輸出重定向到 NUL 中,你什么也看不到;2>&1 : 2:錯(cuò)誤輸出,&1: 標(biāo)準(zhǔn)輸出, 意思就是將錯(cuò)誤消息輸出到標(biāo)準(zhǔn)輸出中;>NUL 2>&1 : 就是先將錯(cuò)誤消息輸出到標(biāo)準(zhǔn)輸出中,然后再輸出到 NUL 中;

  11. exit /B %RETVAL%,退出當(dāng)前批處理, /B 指定退出時(shí)的編號(hào), 把 RETVAL 作為 退出碼, 也就是 call 執(zhí)行的命令的退出碼;

  12. :mainEntry del /Q “%TEMP%\%~nx0.run” >NUL 2>&1,定義一個(gè) mainEntry 標(biāo)簽,然后刪除臨時(shí)目錄中的 catalina.bat.run 文件。

?這段代碼的作用就是調(diào)用本身,判斷臨時(shí)目錄中的文件是否存在來避免二次回調(diào)自己

第二段:

 1 rem Guess CATALINA_HOME if not defined
 2 set "CURRENT_DIR=%cd%"
 3 if not "%CATALINA_HOME%" == "" goto gotHome
 4 set "CATALINA_HOME=%CURRENT_DIR%"
 5 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 6 cd ..
 7 set "CATALINA_HOME=%cd%"
 8 cd "%CURRENT_DIR%"
 9 :gotHome
10 
11 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
12 echo The CATALINA_HOME environment variable is not defined correctly
13 echo This environment variable is needed to run this program
14 goto end
15 :okHome
16 
17 rem Copy CATALINA_BASE from CATALINA_HOME if not defined
18 if not "%CATALINA_BASE%" == "" goto gotBase
19 set "CATALINA_BASE=%CATALINA_HOME%"
20 :gotBase
  1. set "CURRENT_DIR=%cd%",設(shè)置CURRENT_DIR為當(dāng)前目錄bin(假如你是在bin目錄中啟動(dòng));

  2. if not "%CATALINA_HOME%" == "" goto gotHome,CATALINA_HOME不是空就轉(zhuǎn)向gotHome;

  3. set "CATALINA_HOME=%CURRENT_DIR%",設(shè)置CATALINA_HOME指向CURRENT_DIR的目錄,也就是bin目錄;

  4. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome,如果存在%CATALINA_HOME%\bin\catalina.bat,那么就轉(zhuǎn)向okHome,否則退出到父目錄,(顯然不存在bin\bin\catalina.bat);

  5. set "CATALINA_HOME=%cd%",設(shè)置CATALINA_HOME為當(dāng)前目錄(也就是Tomcat的根目錄);

  6. cd "%CURRENT_DIR%",進(jìn)入CURRENT_HOME指向的目錄,也就是bin目錄,執(zhí)行g(shù)otHome標(biāo)簽;

  7. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome,gotHome標(biāo)簽下,如果存在%CATALINA_HOME%\bin\catalina.bat,就轉(zhuǎn)向okHome,因?yàn)镃ATALINA_HOME現(xiàn)在指向的目錄是Tomcat的安裝目錄,所以\bin\catalina.bat文件是存在的,所以轉(zhuǎn)向okHome標(biāo)簽;

  8. if not "%CATALINA_BASE%" == "" goto gotBase,如果CATALINA_BASE變量不是空,就轉(zhuǎn)向gotBase標(biāo)簽(顯然為空);

  9. set "CATALINA_BASE=%CATALINA_HOME%",設(shè)置CATALINA_BASE的值等同與CATALINA_HOME的值(現(xiàn)在CATALINA_BASE也指向的Tomcat的根目錄了)。

這段主要是設(shè)置了兩個(gè)環(huán)境變量 CATALINA_HOME 和 CATALINA_BASE。如果沒有配置 CATALINA_BASE 環(huán)境變量的話, 直接引用 CATALINA_HOME 的值。

第三段:

 1 rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colon
 2 rem as this is used as the separator in the classpath and Java provides no
 3 rem mechanism for escaping if the same character appears in the path. Check this
 4 rem by replacing all occurrences of ';' with '' and checking that neither
 5 rem CATALINA_HOME nor CATALINA_BASE have changed
 6 if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon
 7 echo Using CATALINA_HOME:   "%CATALINA_HOME%"
 8 echo Unable to start as CATALINA_HOME contains a semicolon (;) character
 9 goto end
10 :homeNoSemicolon
11 
12 if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon
13 echo Using CATALINA_BASE:   "%CATALINA_BASE%"
14 echo Unable to start as CATALINA_BASE contains a semicolon (;) character
15 goto end
16 :baseNoSemicolon

這里主要是判斷 CATALINA_HOME 環(huán)境變量的值 和 CATALINA_BASE 環(huán)境變量的值是否以分號(hào)為結(jié)尾,如果以分號(hào)為結(jié)尾的話,就報(bào)錯(cuò)退出。

第四段:

 1 rem Ensure that any user defined CLASSPATH variables are not used on startup,
 2 rem but allow them to be specified in setenv.bat, in rare case when it is needed.
 3 set CLASSPATH=
 4 
 5 rem Get standard environment variables
 6 if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
 7 call "%CATALINA_BASE%\bin\setenv.bat"
 8 goto setenvDone
 9 :checkSetenvHome
10 if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
11 :setenvDone
12 
13 rem Get standard Java environment variables
14 if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
15 echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
16 echo This file is needed to run this program
17 goto end
18 :okSetclasspath
19 call "%CATALINA_HOME%\bin\setclasspath.bat" %1
20 if errorlevel 1 goto end

主要是說,如果Tomcat的bin目錄下面存在setenv.bat腳本的話(setenv.bat是干什么的?上面的注釋說是用戶自定義的環(huán)境變量,但并不是啟動(dòng)時(shí)必須的定義在setenv.bat中),就執(zhí)行它,通常情況下是沒有的,繼而又判斷setclasspath.bat腳本是否存在,如果不存在的話, 直接報(bào)錯(cuò),停止啟動(dòng) Tomcat。如果存在的話,就去調(diào)用它,并把 第一個(gè)參數(shù)傳進(jìn)去。

可以進(jìn)入setclasspath.bat腳本看下,主要設(shè)置了以下幾個(gè)環(huán)境變量:

  • JAVA_HOME
  • JRE_HOME
  • JAVA_ENDORSED_DIRS = %CATALINA_HOME%\endorsed
  • _RUNJAVA = %JRE_HOME%\bin\java.exe
  • _RUNJDB = %JAVA_HOME%\bin\jdb.exe

所以這段是設(shè)置一個(gè)臨時(shí)環(huán)境變量: CLASSPATH。

第五段:

 1 rem Add on extra jar file to CLASSPATH
 2 rem Note that there are no quotes as we do not want to introduce random
 3 rem quotes into the CLASSPATH
 4 if "%CLASSPATH%" == "" goto emptyClasspath
 5 set "CLASSPATH=%CLASSPATH%;"
 6 :emptyClasspath
 7 set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
 8 
 9 if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
10 set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
11 :gotTmpdir
12 
13 rem Add tomcat-juli.jar to classpath
14 rem tomcat-juli.jar can be over-ridden per instance
15 if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
16 set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
17 goto juliClasspathDone
18 :juliClasspathHome
19 set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
20 :juliClasspathDone

這段代碼主要做了三件事:

  • 把 Tomcat bin 目錄下的 bootstrap.jar 加入到環(huán)境變量中;
  • 設(shè)置 CATALINA_TMPDIR 環(huán)境變量的值為 Tomcat 目錄下的 temp 目錄;
  • 把 Tomcat bin 目錄下的 tomcat-juli.jar 加入到環(huán)境變量中;

第六段:

 1 if not "%JSSE_OPTS%" == "" goto gotJsseOpts
 2 set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
 3 :gotJsseOpts
 4 set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
 5 
 6 rem Register custom URL handlers
 7 rem Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
 8 set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
 9 
10 if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
11 set LOGGING_CONFIG=-Dnop
12 if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
13 set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
14 :noJuliConfig
15 
16 if not "%LOGGING_MANAGER%" == "" goto noJuliManager
17 set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
18 :noJuliManager
19 
20 rem Configure JAVA 9 specific start-up parameters
21 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.lang=ALL-UNNAMED"
22 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.io=ALL-UNNAMED"
23 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"

主要是追加一系列的啟動(dòng)參數(shù)到 JAVA_OPTS 這個(gè)環(huán)境變量中。

?

 1 rem Java 9 no longer supports the java.endorsed.dirs
 2 rem system property. Only try to use it if
 3 rem JAVA_ENDORSED_DIRS was explicitly set
 4 rem or CATALINA_HOME/endorsed exists.
 5 set ENDORSED_PROP=ignore.endorsed.dirs
 6 if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar
 7 set ENDORSED_PROP=java.endorsed.dirs
 8 goto doneEndorsed
 9 :noEndorsedVar
10 if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed
11 set ENDORSED_PROP=java.endorsed.dirs
12 :doneEndorsed

?

第七段:

 1 echo Using CATALINA_BASE:   "%CATALINA_BASE%"
 2 echo Using CATALINA_HOME:   "%CATALINA_HOME%"
 3 echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
 4 if ""%1"" == ""debug"" goto use_jdk
 5 echo Using JRE_HOME:        "%JRE_HOME%"
 6 goto java_dir_displayed
 7 :use_jdk
 8 echo Using JAVA_HOME:       "%JAVA_HOME%"
 9 :java_dir_displayed
10 echo Using CLASSPATH:       "%CLASSPATH%"

打印相關(guān)的環(huán)境變量信息。

第八段:

1 set _EXECJAVA=%_RUNJAVA%
2 set MAINCLASS=org.apache.catalina.startup.Bootstrap
3 set ACTION=start
4 set SECURITY_POLICY_FILE=
5 set DEBUG_OPTS=
6 set JPDA=

設(shè)置一些環(huán)境變量:

  1. _RUNJAVA : %JRE_HOME%\bin\java.exe;

  2. MAINCLASS : 指定了 Tomcat 的啟動(dòng)類;

  3. ACTION : 動(dòng)作, 就是啟動(dòng);

  4. SECURITY_POLICY_FILE : 安全策略文件,如果啟動(dòng)的時(shí)候加上了 -security 參數(shù)的話,下面會(huì)對(duì)這個(gè)參數(shù)指定到 Tomcat 的 conf 目錄下的 catalina.policy 文件;

  5. JPDA : 還不清楚 。

第九段:

 1 if not ""%1"" == ""jpda"" goto noJpda
 2 set JPDA=jpda
 3 if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
 4 set JPDA_TRANSPORT=dt_socket
 5 :gotJpdaTransport
 6 if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
 7 set JPDA_ADDRESS=localhost:8000
 8 :gotJpdaAddress
 9 if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
10 set JPDA_SUSPEND=n
11 :gotJpdaSuspend
12 if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
13 set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
14 :gotJpdaOpts
15 shift
16 :noJpda

好像直接從第一行跳到了最后一行,一般啟動(dòng)的時(shí)候沒有加 jpda 參數(shù)的話, 這里會(huì)直接跳過,里面的腳本是關(guān)于 JPDA 的設(shè)置等。

第十段:

 1 if ""%1"" == ""debug"" goto doDebug
 2 if ""%1"" == ""run"" goto doRun
 3 if ""%1"" == ""start"" goto doStart
 4 if ""%1"" == ""stop"" goto doStop
 5 if ""%1"" == ""configtest"" goto doConfigTest
 6 if ""%1"" == ""version"" goto doVersion
 7 
 8 echo Usage:  catalina ( commands ... )
 9 echo commands:
10 echo   debug             Start Catalina in a debugger
11 echo   debug -security   Debug Catalina with a security manager
12 echo   jpda start        Start Catalina under JPDA debugger
13 echo   run               Start Catalina in the current window
14 echo   run -security     Start in the current window with security manager
15 echo   start             Start Catalina in a separate window
16 echo   start -security   Start in a separate window with security manager
17 echo   stop              Stop Catalina
18 echo   configtest        Run a basic syntax check on server.xml
19 echo   version           What version of tomcat are you running?
20 goto end

如果用 startup.bat 啟動(dòng) Tomcat 的話, 這里的 “%1” 的值是 start;?
如果通過 catalina.bat run 啟動(dòng) Tomcat 的話,這里的 “%1” 的值是 run;

第十一段:

 1 :doDebug
 2 shift
 3 set _EXECJAVA=%_RUNJDB%
 4 set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"
 5 if not ""%1"" == ""-security"" goto execCmd
 6 shift
 7 echo Using Security Manager
 8 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
 9 goto execCmd
10 
11 :doRun
12 shift
13 if not ""%1"" == ""-security"" goto execCmd
14 shift
15 echo Using Security Manager
16 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
17 goto execCmd
18 
19 :doStart
20 shift
21 if "%TITLE%" == "" set TITLE=Tomcat
22 set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
23 if not ""%1"" == ""-security"" goto execCmd
24 shift
25 echo Using Security Manager
26 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
27 goto execCmd
28 
29 :doStop
30 shift
31 set ACTION=stop
32 set CATALINA_OPTS=
33 goto execCmd
34 
35 :doConfigTest
36 shift
37 set ACTION=configtest
38 set CATALINA_OPTS=
39 goto execCmd
40 
41 :doVersion
42 %_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo
43 goto end

分別對(duì)應(yīng)前面的標(biāo)簽,啟動(dòng)主要涉及doRun和doStart。

第一個(gè) shift 是把 start 或者 run 參數(shù)移除,然后下面 還是利用 “%1” 來取參數(shù), 這時(shí)候, 取出來的就是參數(shù)列表中的第二個(gè);
第二個(gè) shift 是把第二個(gè)參數(shù)移除掉。

我們?cè)賮肀容^一下 start 和 run 的啟動(dòng)區(qū)別.

如果是 startup.bat 腳本啟動(dòng)的話, 會(huì)啟動(dòng)一個(gè)新的 cmd 窗口, 并且把 cmd 的 title 設(shè)置為 Tomcat。
如果是 catalina.bat run 啟動(dòng)的話, 不會(huì)新建 cmd 窗口, 也不會(huì)設(shè)置 cmd 的 title。

最后都跳到了 execCmd 標(biāo)簽處。

第十二段:

1 :execCmd
2 rem Get remaining unshifted command line arguments and save them in the
3 set CMD_LINE_ARGS=
4 :setArgs
5 if ""%1""=="""" goto doneSetArgs
6 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
7 shift
8 goto setArgs
9 :doneSetArgs

這里還是利用 “%1” 來取出啟動(dòng)命令之后的參數(shù), 如果存在, 追加到 CMD_LINE_ARGS 環(huán)境變量上,并把這個(gè)參數(shù)移除。通常情況下,這里是不會(huì)有什么參數(shù)。

最后一段:

 1 rem Execute Java with the applicable properties
 2 if not "%JPDA%" == "" goto doJpda
 3 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
 4 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
 5 goto end
 6 :doSecurity
 7 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%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%
 8 goto end
 9 :doJpda
10 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
11 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
12 goto end
13 :doSecurityJpda
14 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%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%
15 goto end
16 
17 :end

正常啟動(dòng),不會(huì)有jdpa,也不會(huì)有security,所以這大段代碼主要是加一些環(huán)境變量,然后帶上參數(shù)去啟動(dòng)org.apache.catalina.startup.Bootstrap的main方法。

五、總結(jié)

啟動(dòng)tomcat可以雙擊startup.bat,也可以在命令行直接catalina.bat run,大致的流程是這樣:

  1. 首先判斷一下用戶直接使用 catalina.bat run 來啟動(dòng) Tocmat;

  2. 設(shè)置 CATALINA_HOME 和 CATALINA_BASE 環(huán)境變量值;

  3. 驗(yàn)證 CATALINA_HOME 和 CATALINA_BASE 環(huán)境變量值的正確性;

  4. 調(diào)用 setnv.bat 腳本;

  5. 調(diào)用 setclasspath.bat 腳本;

  6. 添加 bootstrap.jar 和 tomcat-juli.jar 到 CLASSPATH 中;

  7. 設(shè)置 CATALINA_TMPDIR 臨時(shí)目錄的值為 Tomcat 目錄下的 temp;

  8. 追加一系列的參數(shù)到 JAVA_OPTS 中;

  9. 整合相關(guān)的啟動(dòng)信息,參數(shù);

  10. 啟動(dòng) Tomcat。

?

轉(zhuǎn)載于:https://www.cnblogs.com/grasp/p/10029871.html

總結(jié)

以上是生活随笔為你收集整理的运行startup.bat的启动过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。