内容简介:Tomcat 7 启动分析(一)启动脚本
在上一篇文章《源代码运行环境搭建》里是通过直接运行 BootStarp 的 main 函数来启动的,只是加了一个 catalina.home 的系统属性。而正常情况下启动 Tomcat 是通过运行脚本的方式,这个就涉及到建立工程时拷贝过来的 script 目录下的一堆脚本文件了。
以我的 windows 系统举例,实际上最终是执行 startup.bat 这个批处理文件来启动 tomcat 的。 那么启动分析就冲这个文件开始吧:
一、分析 startup.bat 文件
startup.bat :
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 if "%OS%" == "Windows_NT" setlocal 18 rem --------------------------------------------------------------------------- 19 rem Start script for the CATALINA Server 20 rem 21 rem $Id: startup.bat 895392 2010-01-03 14:02:31Z kkolinko $ 22 rem --------------------------------------------------------------------------- 23 24 rem Guess CATALINA_HOME if not defined 25 set "CURRENT_DIR=%cd%" 26 if not "%CATALINA_HOME%" == "" goto gotHome 27 set "CATALINA_HOME=%CURRENT_DIR%" 28 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 29 cd .. 30 set "CATALINA_HOME=%cd%" 31 cd "%CURRENT_DIR%" 32 :gotHome 33 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 34 echo The CATALINA_HOME environment variable is not defined correctly 35 echo This environment variable is needed to run this program 36 goto end 37 :okHome 38 39 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" 40 41 rem Check that target executable exists 42 if exist "%EXECUTABLE%" goto okExec 43 echo Cannot find "%EXECUTABLE%" 44 echo This file is needed to run this program 45 goto end 46 :okExec 47 48 rem Get remaining unshifted command line arguments and save them in the 49 set CMD_LINE_ARGS= 50 :setArgs 51 if ""%1""=="""" goto doneSetArgs 52 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 53 shift 54 goto setArgs 55 :doneSetArgs 56 57 call "%EXECUTABLE%" start %CMD_LINE_ARGS% 58 59 :end
第 1 行 @echo off
的是关闭显示命令行自身的意思,接下来一大堆 rem 是注释,第 17 行 if "%OS%" == "Windows_NT" setlocal
是要临时修改系统变量,方便批处理运行。第 26 到 33 行的作用是设置 CATALINA_HOME
环境变量,如果操作系统中没设置,则将当前运行脚本的目录作为该环境变量的值,最终都会跳转到 37 行。39 到 46 行验证 CATALINA_HOME
变量所示目录下的 catalina.bat 文件是否存在,不存在则批处理直接结束。48 到 55 行将运行脚本前如果设置了其他参数,将参数保存到 CMD_LINE_ARGS
变量中。最后第 57 行执行 catalina.bat 批处理文件,注意,该行后面跟着两个参数,第 1 个参数是 start。
二、分析 catalina.bat 文件
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 if "%OS%" == "Windows_NT" setlocal 18 rem --------------------------------------------------------------------------- 19 rem Start/Stop Script for the CATALINA Server 20 rem 21 rem Environment Variable Prerequisites 22 rem 23 rem Do not set the variables in this script. Instead put them into a script 24 rem setenv.bat in CATALINA_BASE/bin to keep your customizations separate. 25 rem 26 rem CATALINA_HOME May point at your Catalina "build" directory. 27 rem 28 rem CATALINA_BASE (Optional) Base directory for resolving dynamic portions 29 rem of a Catalina installation. If not present, resolves to 30 rem the same directory that CATALINA_HOME points to. 31 rem 32 rem CATALINA_OPTS (Optional) Java runtime options used when the "start", 33 rem "run" or "debug" command is executed. 34 rem Include here and not in JAVA_OPTS all options, that should 35 rem only be used by Tomcat itself, not by the stop process, 36 rem the version command etc. 37 rem Examples are heap size, GC logging, JMX ports etc. 38 rem 39 rem CATALINA_TMPDIR (Optional) Directory path location of temporary directory 40 rem the JVM should use (java.io.tmpdir). Defaults to 41 rem %CATALINA_BASE%\temp. 42 rem 43 rem JAVA_HOME Must point at your Java Development Kit installation. 44 rem Required to run the with the "debug" argument. 45 rem 46 rem JRE_HOME Must point at your Java Runtime installation. 47 rem Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME 48 rem are both set, JRE_HOME is used. 49 rem 50 rem JAVA_OPTS (Optional) Java runtime options used when any command 51 rem is executed. 52 rem Include here and not in CATALINA_OPTS all options, that 53 rem should be used by Tomcat and also by the stop process, 54 rem the version command etc. 55 rem Most options should go into CATALINA_OPTS. 56 rem 57 rem JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories 58 rem containing some jars in order to allow replacement of APIs 59 rem created outside of the JCP (i.e. DOM and SAX from W3C). 60 rem It can also be used to update the XML parser implementation. 61 rem Defaults to $CATALINA_HOME/endorsed. 62 rem 63 rem JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start" 64 rem command is executed. The default is "dt_socket". 65 rem 66 rem JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start" 67 rem command is executed. The default is 8000. 68 rem 69 rem JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start" 70 rem command is executed. Specifies whether JVM should suspend 71 rem execution immediately after startup. Default is "n". 72 rem 73 rem JPDA_OPTS (Optional) Java runtime options used when the "jpda start" 74 rem command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS, 75 rem and JPDA_SUSPEND are ignored. Thus, all required jpda 76 rem options MUST be specified. The default is: 77 rem 78 rem -agentlib:jdwp=transport=%JPDA_TRANSPORT%, 79 rem address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND% 80 rem 81 rem LOGGING_CONFIG (Optional) Override Tomcat's logging config file 82 rem Example (all one line) 83 rem set LOGGING_CONFIG="-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties" 84 rem 85 rem LOGGING_MANAGER (Optional) Override Tomcat's logging manager 86 rem Example (all one line) 87 rem set LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" 88 rem 89 rem TITLE (Optional) Specify the title of Tomcat window. The default 90 rem TITLE is Tomcat if it's not specified. 91 rem Example (all one line) 92 rem set TITLE=Tomcat.Cluster#1.Server#1 [%DATE% %TIME%] 93 rem 94 rem 95 rem 96 rem $Id: catalina.bat 1344732 2012-05-31 14:08:02Z kkolinko $ 97 rem --------------------------------------------------------------------------- 98 99 rem Suppress Terminate batch job on CTRL+C 100 if not ""%1"" == ""run"" goto mainEntry 101 if "%TEMP%" == "" goto mainEntry 102 if exist "%TEMP%\%~nx0.run" goto mainEntry 103 echo Y>"%TEMP%\%~nx0.run" 104 if not exist "%TEMP%\%~nx0.run" goto mainEntry 105 echo Y>"%TEMP%\%~nx0.Y" 106 call "%~f0" %* <"%TEMP%\%~nx0.Y" 107 rem Use provided errorlevel 108 set RETVAL=%ERRORLEVEL% 109 del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1 110 exit /B %RETVAL% 111 :mainEntry 112 del /Q "%TEMP%\%~nx0.run" >NUL 2>&1 113 114 rem Guess CATALINA_HOME if not defined 115 set "CURRENT_DIR=%cd%" 116 if not "%CATALINA_HOME%" == "" goto gotHome 117 set "CATALINA_HOME=%CURRENT_DIR%" 118 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 119 cd .. 120 set "CATALINA_HOME=%cd%" 121 cd "%CURRENT_DIR%" 122 :gotHome 123 124 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 125 echo The CATALINA_HOME environment variable is not defined correctly 126 echo This environment variable is needed to run this program 127 goto end 128 :okHome 129 130 rem Copy CATALINA_BASE from CATALINA_HOME if not defined 131 if not "%CATALINA_BASE%" == "" goto gotBase 132 set "CATALINA_BASE=%CATALINA_HOME%" 133 :gotBase 134 135 rem Ensure that any user defined CLASSPATH variables are not used on startup, 136 rem but allow them to be specified in setenv.bat, in rare case when it is needed. 137 set CLASSPATH= 138 139 rem Get standard environment variables 140 if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome 141 call "%CATALINA_BASE%\bin\setenv.bat" 142 goto setenvDone 143 :checkSetenvHome 144 if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" 145 :setenvDone 146 147 rem Get standard Java environment variables 148 if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath 149 echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat" 150 echo This file is needed to run this program 151 goto end 152 :okSetclasspath 153 call "%CATALINA_HOME%\bin\setclasspath.bat" %1 154 if errorlevel 1 goto end 155 156 rem Add on extra jar file to CLASSPATH 157 rem Note that there are no quotes as we do not want to introduce random 158 rem quotes into the CLASSPATH 159 if "%CLASSPATH%" == "" goto emptyClasspath 160 set "CLASSPATH=%CLASSPATH%;" 161 :emptyClasspath 162 set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar" 163 164 if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir 165 set "CATALINA_TMPDIR=%CATALINA_BASE%\temp" 166 :gotTmpdir 167 168 rem Add tomcat-juli.jar to classpath 169 rem tomcat-juli.jar can be over-ridden per instance 170 if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome 171 set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar" 172 goto juliClasspathDone 173 :juliClasspathHome 174 set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar" 175 :juliClasspathDone 176 177 if not "%LOGGING_CONFIG%" == "" goto noJuliConfig 178 set LOGGING_CONFIG=-Dnop 179 if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig 180 set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 181 :noJuliConfig 182 set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% 183 184 if not "%LOGGING_MANAGER%" == "" goto noJuliManager 185 set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 186 :noJuliManager 187 set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER% 188 189 rem ----- Execute The Requested Command --------------------------------------- 190 191 echo Using CATALINA_BASE: "%CATALINA_BASE%" 192 echo Using CATALINA_HOME: "%CATALINA_HOME%" 193 echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%" 194 if ""%1"" == ""debug"" goto use_jdk 195 echo Using JRE_HOME: "%JRE_HOME%" 196 goto java_dir_displayed 197 :use_jdk 198 echo Using JAVA_HOME: "%JAVA_HOME%" 199 :java_dir_displayed 200 echo Using CLASSPATH: "%CLASSPATH%" 201 202 set _EXECJAVA=%_RUNJAVA% 203 set MAINCLASS=org.apache.catalina.startup.Bootstrap 204 set ACTION=start 205 set SECURITY_POLICY_FILE= 206 set DEBUG_OPTS= 207 set JPDA= 208 209 if not ""%1"" == ""jpda"" goto noJpda 210 set JPDA=jpda 211 if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport 212 set JPDA_TRANSPORT=dt_socket 213 :gotJpdaTransport 214 if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress 215 set JPDA_ADDRESS=8000 216 :gotJpdaAddress 217 if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend 218 set JPDA_SUSPEND=n 219 :gotJpdaSuspend 220 if not "%JPDA_OPTS%" == "" goto gotJpdaOpts 221 set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND% 222 :gotJpdaOpts 223 shift 224 :noJpda 225 226 if ""%1"" == ""debug"" goto doDebug 227 if ""%1"" == ""run"" goto doRun 228 if ""%1"" == ""start"" goto doStart 229 if ""%1"" == ""stop"" goto doStop 230 if ""%1"" == ""configtest"" goto doConfigTest 231 if ""%1"" == ""version"" goto doVersion 232 233 echo Usage: catalina ( commands ... ) 234 echo commands: 235 echo debug Start Catalina in a debugger 236 echo debug -security Debug Catalina with a security manager 237 echo jpda start Start Catalina under JPDA debugger 238 echo run Start Catalina in the current window 239 echo run -security Start in the current window with security manager 240 echo start Start Catalina in a separate window 241 echo start -security Start in a separate window with security manager 242 echo stop Stop Catalina 243 echo configtest Run a basic syntax check on server.xml 244 echo version What version of tomcat are you running? 245 goto end 246 247 :doDebug 248 shift 249 set _EXECJAVA=%_RUNJDB% 250 set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java" 251 if not ""%1"" == ""-security"" goto execCmd 252 shift 253 echo Using Security Manager 254 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" 255 goto execCmd 256 257 :doRun 258 shift 259 if not ""%1"" == ""-security"" goto execCmd 260 shift 261 echo Using Security Manager 262 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" 263 goto execCmd 264 265 :doStart 266 shift 267 if not "%OS%" == "Windows_NT" goto noTitle 268 if "%TITLE%" == "" set TITLE=Tomcat 269 set _EXECJAVA=start "%TITLE%" %_RUNJAVA% 270 goto gotTitle 271 :noTitle 272 set _EXECJAVA=start %_RUNJAVA% 273 :gotTitle 274 if not ""%1"" == ""-security"" goto execCmd 275 shift 276 echo Using Security Manager 277 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" 278 goto execCmd 279 280 :doStop 281 shift 282 set ACTION=stop 283 set CATALINA_OPTS= 284 goto execCmd 285 286 :doConfigTest 287 shift 288 set ACTION=configtest 289 set CATALINA_OPTS= 290 goto execCmd 291 292 :doVersion 293 %_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo 294 goto end 295 296 297 :execCmd 298 rem Get remaining unshifted command line arguments and save them in the 299 set CMD_LINE_ARGS= 300 :setArgs 301 if ""%1""=="""" goto doneSetArgs 302 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 303 shift 304 goto setArgs 305 :doneSetArgs 306 307 rem Execute Java with the applicable properties 308 if not "%JPDA%" == "" goto doJpda 309 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity 310 %_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% 311 goto end 312 :doSecurity 313 %_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% 314 goto end 315 :doJpda 316 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda 317 %_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% 318 goto end 319 :doSecurityJpda 320 %_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% 321 goto end 322 323 :end
1 到 99 行一大堆注释说明就不看了,100 到 110 行一堆 run 文件校验之类的一般用不到,直接跳到 111 行,接下来先删除上面可能产生的中间文件,接着按照正常流程,在上面的 startup.bat 文件中已经设置过 CATALINA_HOME
变量,并且校验了改变量下 bin\catalina.bat 文件已经存在(我猜作者写这一段是防止用户直接运行 catalina.bat 文件)。经过这些判断后跳转到 128 行,130 到 133 行设置 CATALINA_BASE
变量,中间几行注释略过,139 到 144 行如果有 setenv.bat 文件则执行一下该文件。147 到 153 行执行 setclasspath.bat 文件(该文件在同级目录下已经提供,具体脚本下面已经贴出来了,可以读一下,这里不再做分析。主要功能校验是否设置 JAVA_HOME
变量,没有则在控制台显示出提示信息。注意该文件中第 79 行将会设置 _RUNJAVA
变量,该变量的值即 JAVA_HOME
或 JRE_HOME
的 bin 目录下的 java.exe 文件)。从 156 到 224 行校验并设置一堆变量(注意第 202、203 和 204 行,最后启动分析时将会用到)。226 到 231 行将根据调用 catalina.bat 时设置的参数决定跳转,按照上一段的最后的说明,此时将会跳转到 doStart 标记行。从 265 行开始,校验和设置一些变量之后(注意第 269 行)将会跳转到 execCmd 标记行,即 297 行。297 到 305 行作用是将系统参数保存到 CMD_LINE_ARGS
变量中。
接下来便是谜底解开的时候,正常情况下将会执行到 310 行,这里单独贴出来分析一下: %_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%
按照 202 行的提示 _EXECJAVA
一开始的值等于 _RUNJAVA
,但在 269 行将该值改成了 start "%TITLE%" %_RUNJAVA%
,这里的作用是另启动一个命令行窗口,并给窗口起名,最终还是执行 java.exe 文件。从 %JAVA_OPTS%
开始到 %MAINCLASS%
之前都是在设置运行时参数和系统属性, %MAINCLASS%
即 203 行的 org.apache.catalina.startup.Bootstrap,后面是其它的命令行参数,最后一个参数 %ACTION%
在 204 行时被设置成 start。归结起来一句话,即执行 Bootstrap 类的 main 方法。
setclasspath.bat:
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 Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings 19 rem are valid and consistent with the selected start-up options and set up the 20 rem endorsed directory. 21 rem 22 rem $Id: setclasspath.bat 1202062 2011-11-15 06:50:02Z mturk $ 23 rem --------------------------------------------------------------------------- 24 25 rem Make sure prerequisite environment variables are set 26 27 rem In debug mode we need a real JDK (JAVA_HOME) 28 if ""%1"" == ""debug"" goto needJavaHome 29 30 rem Otherwise either JRE or JDK are fine 31 if not "%JRE_HOME%" == "" goto gotJreHome 32 if not "%JAVA_HOME%" == "" goto gotJavaHome 33 echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 34 echo At least one of these environment variable is needed to run this program 35 goto exit 36 37 :needJavaHome 38 rem Check if we have a usable JDK 39 if "%JAVA_HOME%" == "" goto noJavaHome 40 if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome 41 if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome 42 if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome 43 if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome 44 set "JRE_HOME=%JAVA_HOME%" 45 goto okJava 46 47 :noJavaHome 48 echo The JAVA_HOME environment variable is not defined correctly. 49 echo It is needed to run this program in debug mode. 50 echo NB: JAVA_HOME should point to a JDK not a JRE. 51 goto exit 52 53 :gotJavaHome 54 rem No JRE given, use JAVA_HOME as JRE_HOME 55 set "JRE_HOME=%JAVA_HOME%" 56 57 :gotJreHome 58 rem Check if we have a usable JRE 59 if not exist "%JRE_HOME%\bin\java.exe" goto noJreHome 60 if not exist "%JRE_HOME%\bin\javaw.exe" goto noJreHome 61 goto okJava 62 63 :noJreHome 64 rem Needed at least a JRE 65 echo The JRE_HOME environment variable is not defined correctly 66 echo This environment variable is needed to run this program 67 goto exit 68 69 :okJava 70 rem Don't override the endorsed dir if the user has set it previously 71 if not "%JAVA_ENDORSED_DIRS%" == "" goto gotEndorseddir 72 rem Set the default -Djava.endorsed.dirs argument 73 set "JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed" 74 :gotEndorseddir 75 76 rem Set standard command for invoking Java. 77 rem Note that NT requires a window name argument when using start. 78 rem Also note the quoting as JAVA_HOME may contain spaces. 79 set _RUNJAVA="%JRE_HOME%\bin\java" 80 set _RUNJDB="%JAVA_HOME%\bin\jdb" 81 82 goto end 83 84 :exit 85 exit /b 1 86 87 :end 88 exit /b 0
三、总结
以上即 tomcat 的启动脚本中的总体流程,只是讲了默认的脚本运行方式,但在脚本阅读中可以看到能根据 catalina.bat 里可以根据不同参数以不同方式运行 tomcat :
debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window run -security Start in the current window with security manager start Start Catalina in a separate window start -security Start in a separate window with security manager stop Stop Catalina configtest Run a basic syntax check on server.xml
只要能看懂基本 dos 命令,这几个脚本的阅读其实很简单,其他 bat 文件可以大体浏览一下,会发现转了半天,最终都会执行 catalina.bat 文件,而 catalina.bat 文件里最终会执行 Bootstrap 文件的 main 方法,不同的是调用 main 方法时会各自添加不同的入参而已。bat 文件用于 windows 操作系统下启动 tomcat,而 sh 文件则用于 unix 环境下的启动,原理是一致的。
以上所述就是小编给大家介绍的《Tomcat 7 启动分析(一)启动脚本》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 超实用的Tomcat启动脚本实现
- React Native启动脚本解读、优化
- 启动sqlserver服务的bat脚本分享
- 脚本文件里的 Hybrid Script(混合式脚本)
- 脚本错误量极致优化-定位压缩且无 SourceMap 文件的脚本错误
- 如何从PHP脚本(如批处理文件)中运行多个PHP脚本?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Designing Data-Intensive Applications
Martin Kleppmann / O'Reilly Media / 2017-4-2 / USD 44.99
Data is at the center of many challenges in system design today. Difficult issues need to be figured out, such as scalability, consistency, reliability, efficiency, and maintainability. In addition, w......一起来看看 《Designing Data-Intensive Applications》 这本书的介绍吧!