在上一次查看tomcat启动文件都干点啥一文中,咱们总结出,startup.bat文件的做用就是找到catalina.bat文件,而后把参数传递给它,在startup.bat中,调用catalina.bat的命令call "%EXECUTABLE%" start %CMD_LINE_ARGS%,其中"%EXECUTABLE%"这个就是catalina.bat文件,这个命令至少向catalina.bat传递一个参数--start.html
接下来看一下catalina.bat中的内容,内容很长:java
在第1行,和第17行中的内容已经在前一章中作出说明,在此处再也不敖述,我对于18-85行的这段注释比较感兴趣:apache
1 rem --------------------------------------------------------------------------- 2 rem Start/Stop Script for the CATALINA Server 3 rem 4 rem Environment Variable Prerequisites 5 rem 6 rem CATALINA_HOME May point at your Catalina "build" directory. 7 rem 8 rem CATALINA_BASE (Optional) Base directory for resolving dynamic portions 9 rem of a Catalina installation. If not present, resolves to 10 rem the same directory that CATALINA_HOME points to. 11 rem 12 rem CATALINA_OPTS (Optional) Java runtime options used when the "start", 13 rem or "run" command is executed. 14 rem 15 rem CATALINA_TMPDIR (Optional) Directory path location of temporary directory 16 rem the JVM should use (java.io.tmpdir). Defaults to 17 rem %CATALINA_BASE%\temp. 18 rem 19 rem JAVA_HOME Must point at your Java Development Kit installation. 20 rem Required to run the with the "debug" argument. 21 rem 22 rem JRE_HOME Must point at your Java Runtime installation. 23 rem Defaults to JAVA_HOME if empty. 24 rem 25 rem JAVA_OPTS (Optional) Java runtime options used when the "start", 26 rem "stop", or "run" command is executed. 27 rem 28 rem JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories 29 rem containing some jars in order to allow replacement of APIs 30 rem created outside of the JCP (i.e. DOM and SAX from W3C). 31 rem It can also be used to update the XML parser implementation. 32 rem Defaults to $CATALINA_HOME/endorsed. 33 rem 34 rem JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start" 35 rem command is executed. The default is "dt_socket". 36 rem 37 rem JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start" 38 rem command is executed. The default is 8000. 39 rem 40 rem JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start" 41 rem command is executed. Specifies whether JVM should suspend 42 rem execution immediately after startup. Default is "n". 43 rem 44 rem JPDA_OPTS (Optional) Java runtime options used when the "jpda start" 45 rem command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS, 46 rem and JPDA_SUSPEND are ignored. Thus, all required jpda 47 rem options MUST be specified. The default is: 48 rem 49 rem -agentlib:jdwp=transport=%JPDA_TRANSPORT%, 50 rem address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND% 51 rem 52 rem LOGGING_CONFIG (Optional) Override Tomcat's logging config file 53 rem Example (all one line) 54 rem set LOGGING_CONFIG="-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties" 55 rem 56 rem LOGGING_MANAGER (Optional) Override Tomcat's logging manager 57 rem Example (all one line) 58 rem set LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" 59 rem 60 rem TITLE (Optional) Specify the title of Tomcat window. The default 61 rem TITLE is Tomcat if it's not specified. 62 rem Example (all one line) 63 rem set TITLE=Tomcat.Cluster#1.Server#1 [%DATE% %TIME%] 64 rem 65 rem 66 rem 67 rem $Id: catalina.bat 1040546 2010-11-30 14:47:34Z markt $ 68 rem ---------------------------------------------------------------------------
这段的内容就是说明一下在启动和中止CATALINA server时候须要的一下先决条件,CATALINA_HOME--看到这个你们可能会有点疑问,若是在操做系统上没有设置CATALINA_HOME 变量的时候,那么这个变量应该是不存在的丫,是怎么回事呢?是否是?下面咱们仍是用测试来讲明问题:我在F:\apache-tomcat-7.0.8 \bin目录下建立一个test.bat文件,文件内容以下: bootstrap
@echo off set CURRENT_DIR=%cd% test2.bat
意思很简单,只是将%cd%变量的值赋给CURRENT_DIR变量,而后调用test2.bat文件,test2.bat文件的内容以下:tomcat
echo %CURRENT_DIR%
只是简单的输出%CURRENT_DIR%变量,让咱们先运行test.bat文件,查看%CURRENT_DIR%变量是否可以正确输出:安全
结果正确显示了,可是若是咱们直接运行test2.bat文件会有什么结果呢?app
结果显示不正常,这个测试就说明由test.bat调用test2.bat文件时候,test.bat中定义的变量在test2.bat中可见,就是 CURRENT_DIR变量的生命周期范围并非仅限于本文件,也能加深对于setlocal方法的理解。回到catalina.bat自己,也许咱们本 身没有设置CATALINA_HOME环境变量的习惯,可是回想一下上一节,在startup.bat中说到,若是没有设置CATALINA_HOME变 量,startup.bat内会给CATALINA_HOME变量赋值,而后在catalina.bat中依然可以访问此变量。dom
这段注释说完以后,看一下88行: socket
if not ""%1"" == ""run"" goto mainEntry
若是接收到的第一个参数是run那么到:mainEntry节点,事实是咱们从startup.bat调用的时候传递的第一个参数无疑是 start,因此应该顺序执行到第89行,这里可能有人会有疑问,那何时第一个参数才是run呢?事情是这样的,由于并非全部人都是跟咱们同样直接 使用startup.bat文件启动,由于startup.bat文件也只不过就是找到catalina.bat文件,而后照样传递参数,其实有经验的人 大可直接使用catalina.bat文件来启动tomcat。这就是第一个参数为run的产生状况。接下来咱们顺序执行到第89行。ide
看一下89行的内容:
if ""%TEMP%"" == """" goto mainEntry
若是TEMP变量为空,那么到mainEntry节点,这个时候咱们就须要看看咱们到底有没有这个TEMP变量,一样弄个小测试,写一个小的测试test.bat文件,文件内容以下:
@echo off echo %TEMP%
查看执行结果:
记得在上一节中说过%TEMP%这个变量是从环境变量中读取的,因此也能够去环境变量中查看是否是有此值,来肯定TEMP变量是否是存在,一问在startup.bat和catalina.bat并无设置TEMP变量。查看环境变量:
由于TEMP存在,因此程序还须要顺序执行到90行,第90行的内容以下:
if exist "%TEMP%\%~nx0.run" goto mainEntry
这句话至少看起来有点蒙圈,尤为是\%~nx0.run这个东西,反正我第一次看见的时候我就想问问,这是毛啊,~nx0,下面看一下网上对于%~nx0的解释:
%~nx0 contains the name of the running batch file (without the path)
意思就是表明执行命令的文件的名字,咱们来用实验证实一下,一样仍是修改那个test.bat文件吧。;-)
@echo off echo "%TEMP%\%~nx0.run"
若是按照上面的解释,那么输出的信息应该是C:\Users\Think\AppData\Local\Temp\test.bat.run,下面看一下运行结果:
咦事实证实说法正确,可是这个文件是否是存在呢,咱们去TEMP目录下看一下,遗憾的是在C:\Users\Think\AppData\Local\Temp目录没有找到这个文件,因此还得顺序执行到第91行,91行的内容是:
echo Y>"%TEMP%\%~nx0.run"
这个看起来很简单,既然不存在这个文件,那么我就本身建立一个,同时写入Y。也许你不信,因此我仍是拿出个例子吧,仍是test.bat呦:
@echo off echo Y>"%TEMP%\%~nx0.run"
在C:\Users\Think\AppData\Local\Temp目录下生成了test.bat.run文件,文件的内容果真为Y。至于 生成的文件有何意义,之后再说。到如今位置我忽然感慨,我很喜欢TOMCAT,它作了什么我都能知道,在接下来的一段时间内,我想把我看TOMCAT源代 码的感觉也下下来。也跟你们讨论一下TOMCAT的工做原理。有点远,扯回来,下面看一下92行的内容:
if not exist "%TEMP%\%~nx0.run" goto mainEntry
这个一眼就看明白了,再次判断%~nx0.run文件是否存在,若是仍是不存在,那么直接到mainEntry节点,因为咱们此时此文件已经建立成功,那么顺序执行到第93行。
93行的内容为:
echo Y>"%TEMP%\%~nx0.Y"
这个同91行命令,再也不强调。顺序执行到92行。
92行的内容为:
call "%~f0" %* <"%TEMP%\%~nx0.Y"
看到以后感受依然是蒙圈,这里面有两个点须要你们掌握:%~f0, %* 知道这两组符号是什么意思,就解决了。
%~f0:表示运行的文件的全路径,假如我在test.bat中如此写:
@echo off @echo %%~f0 is %~f0
那么执行结果为:
OK。
%*:在batch file中,每个命令的参数都以%1,%2,%3 .....的形式展示,咱们也可使用%来代替全部的参数,下面看修改万能测试文件test.bat中的内容以下:
@echo off echo First argument: [%1] echo Second argument: [%2] echo Third argument: [%3] echo Fourth argument: [%4] echo Fifth argument: [%4] echo Entire command line: [%*]
查看运行结果:
意思就是将在catalina.bat文件中本身调用本身,传递参数Y,下面看一下测试,将test.bat中的内容改成:
@echo off call "%~f0" %* <"%TEMP%\%~nx0.Y"
查看运行结果,在程序运行了一段时间之后,得出以下结论:
很奇怪,奇怪亮点,为何运行的时候会有停顿,第二,为何会产生这个结果。下面解决这两个困惑,我以为程序在运行的时候确定是在后台运行什么操做了,因此我将test.bat中的内容改了一下:
call "%~f0" %* <"%TEMP%\%~nx0.Y"
而后再次运行,获得结果:
原来程序在输出最终结果以前一直到在调用本身,因此会有一个停顿的感受。
第二:为何会产生这个结果:
下面看第96行的内容:
set RETVAL=%ERRORLEVEL%
在前面的的内容中可能给你们一种误解,因此在看到这句话的时候,不知道是否是也有人跟我似的直接去环境变量中找ERRORLEVEL的值,找不 到以后以为我在忽悠你们,下面我跟你们说说这个ERRORLEVEL。不知道你们是否是了解在Linux中的$?这个结果返回值,其实 ERRORLEVEL和$?差很少,都是用来表示上次执行结果的,若是返回0说明执行正确,若是不是0说明执行失败。例如在test.bat中的内容:
call %ERRORLEVEL%
执行结果:
下面看97行的内容:
del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
这里面有/Q, >NUL, 2>&1须要跟你们解释一下:
/Q: 跟在del后面表示不须要交互式的删除。安静模式的意思。如在test.bat中的内容以下:
del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
而后运行结果为:
此时文件系统中的文件确实已经被删除,只是在删除的过程当中没有显示删除的过程,下面咱们从新建立此文件,而后把/Q标记去掉之后在尝试一次:
>NUL 就是将输出输出到NUL中,这样有错误的状况下你什么都拿不到。
2>&1:2是值错误输出,&1是标准输出,意思就是将错误输出重定向到标准输出中
>NUL 2>&1的意思就是将错误输出重定向到标准输出,最后在重定向到NUL中,这样出现错误,你从表面上不会看出来。若是将test.bat中的删除操做执行屡次,
@echo off del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
看结果:
也不会显示异常,若是将>NUL 2>&1删除之后,再次执行:
@echo off del /Q "%TEMP%\%~nx0.Y"
结果就会显示出异常:
下面看第98行的内容:
exit /B %RETVAL%
下面的mainEntry和gotHome节点的信息同前一节刚开始的内容同样,全部就再也不说明,若是对此有什么疑问,请查看查看tomcat启动文件都干点啥一节。在接下来的部分中我想把115-137行的内容放在一块儿说明,由于他们分为两部分,分别引入setenv.bat和setclasspath.bat并执行,
:okHome
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 Get standard environment variables if "%CATALINA_BASE%" == "" goto gotSetenvHome if exist "%CATALINA_BASE%\bin\setenv.bat" call "%CATALINA_BASE%\bin\setenv.bat" goto gotSetenvBase :gotSetenvHome if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" :gotSetenvBase 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 set "BASEDIR=%CATALINA_HOME%" call "%CATALINA_HOME%\bin\setclasspath.bat" %1 if errorlevel 1 goto end
这部分的操做就是设置环境变量,因为在tomcat7.0.8版本中不存在setenv.bat因此就不说了,setclasspath.bat这个脚本很重要,浏览一下其中的内容:
其中就是关于JAVA环境的一些校验和变量的设置,重要性不言而喻,因此若是执行本步操做失败的状况下,程序将退出执行。
接下来是设置CLASSPATH的内容,看过前面的说明之后,对于下面的内容应该很容易就能看懂:
rem Add on extra jar file to CLASSPATH 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" if not "%CATALINA_BASE%" == "" goto gotBase set "CATALINA_BASE=%CATALINA_HOME%" :gotBase if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir set "CATALINA_TMPDIR=%CATALINA_BASE%\temp" :gotTmpdir 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
将tomcat-juli.jar和bootstrap.jar的全路径追加到CLASSPATH中,究竟这两个jar包是作什么的,不是本文的范畴,只说明这两个jar包须要在CLASSPATH中体现。
接下来是关于Log选项的问题:
内容很简单,一看就明白,因此也很少说了。
在前面准备了这么久,接下来终于到执行的时候了。下面看一下这段脚本:
前三行的内容是将当前设置的变量进行输出,
echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Using CATALINA_HOME: "%CATALINA_HOME%" echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
CATALINA_BASE,CATALINA_HOME,CATALINA_TMPDIR这三个变量在startup.bat或者catalina.bat中已经提早设置了,射出只是为了提示用户当前的运行环境,接下来看181-187行的内容:
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%"
在解释这段内容以前,我建议你们要对setclasspath.bat中的内容有所了解,由于setclasspath.bat中包含对与 JRE_HOME,JAVA_HOME变量的逻辑处理和定义。这段内容的意思就是说若是catalina.bat接收到的第一个参数是debug,那么就 到use_jdk节点,因为通常状况下咱们是用startup.bat脚本调用catalina.bat脚本,因此第一个参数应该是start,因此应该 顺序执行到182行echo Using JRE_HOME: "%JRE_HOME%",而后执行到java_dir_displayed节点,至于为何debug的时候不使用JRE_HOME这个变量,咱们先记下,在之后的章节中在讨论。
在189-194行中是设置一些变量,内容以下:
set _EXECJAVA=%_RUNJAVA% set MAINCLASS=org.apache.catalina.startup.Bootstrap set ACTION=start set SECURITY_POLICY_FILE= set DEBUG_OPTS= set JPDA=
这里面要说两点,%_RUNJAVA%变量和org.apache.catalina.startup.Bootstrap,其中%_RUNJAVA%是在setclasspath.bat文件中定义的,其值为"%JRE_HOME%\bin\java",
MAINCLASS写过JAVA程序的人应该都知道是作什么用的,关键是org.apache.catalina.startup.Bootstrap这个值是怎么来的,在哪里定义的,记得在catalina.bat中有过这么一个设置:CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar,其中org.apache.catalina.startup.Bootstrap就是该jar包中的一个类。具体内容以及意义再也不此展开。
第196行-211行是对jpda()的处理,由于我们没有涉及,关于jdpa的内容不在此展开,由于咱们不涉及因此跳过此步骤:
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
再次记下一个知识点JDPA。
下面到noJpda节点,内容以下:
if ""%1"" == ""debug"" goto doDebug if ""%1"" == ""run"" goto doRun if ""%1"" == ""start"" goto doStart if ""%1"" == ""stop"" goto doStop if ""%1"" == ""version"" goto doVersion 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 version What version of tomcat are you running? goto end
其中
if ""%1"" == ""debug"" goto doDebug if ""%1"" == ""run"" goto doRun if ""%1"" == ""start"" goto doStart if ""%1"" == ""stop"" goto doStop if ""%1"" == ""version"" goto doVersion
是根据用户输入的具体命令,跳转到具体的处理节点,例如输入的命令,那么就到doStart节点,219行-230行的内容是,若是你输入的第一个参数再也不预设的命令当中,给你的提示:
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 version What version of tomcat are you running? goto end
下面先看232行-240行的doDebug节点的内容:
: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
一样%_RUNJDB%变量去setclasspath.bat文件中找定义,235行的内容配置DEBUG_OPTS,接下来是安全策略的问题,若是指定参数"-security",那么就须要加载安全策略文件,安全策略文件为%CATALINA_BASE%\conf\catalina.policy,内容以下:
里面涉及到一些权限的设置,有兴趣你们能够仔细研究。最终执行execCmd节点的脚本。
242行-248行doRun节点内容以下:
:doRun
shift if not ""%1"" == ""-security"" goto execCmd shift echo Using Security Manager set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" goto execCmd
内容同doDebug内容类似,只是判断是否是须要加载安全配置文件。
250行-263行的doStart节点:
:doStart
shift if not "%OS%" == "Windows_NT" goto noTitle if "%TITLE%" == "" set TITLE=Tomcat set _EXECJAVA=start "%TITLE%" %_RUNJAVA% goto gotTitle :noTitle set _EXECJAVA=start %_RUNJAVA% :gotTitle if not ""%1"" == ""-security"" goto execCmd shift echo Using Security Manager set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" goto execCmd
主要内容就是,若是%OS%环境变量不是Windows_NT,那么不设置标题,直接判断是否须要加载安全配置文件,若是%OS%环境变量的值为Windows_NT,那么设置Title变量,若是没有指定Title变量,默认值为Tomcat,设置完_EXECJAVA变量之后,执行execCmd节点的脚本。
265行-269行的doStop节点,内容比较简单,主要就是设置一下ACTION变量,内容以下:
:doStop
shift set ACTION=stop set CATALINA_OPTS= goto execCmd
271行-273行的doVersion节点,就是调用了一下"%CATALINA_HOME%\lib\catalina.jar"中的org.apache.catalina.util.ServerInfo方法,内容以下:
:doVersion %_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo goto end
下面真正的重点来了,execCmd节点,其中有和startup.bat中处理参与同样功能的节点setArgs,从279行-283行,循环读出参数中的内容追加到CMD_LINE_ARGS变量中,内容以下:
set CMD_LINE_ARGS=
:setArgs if ""%1""=="""" goto doneSetArgs set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 shift goto setArgs
286行-300行的内容就是真正的执行方法了,先看内容:
rem Execute Java with the applicable properties if not "%JPDA%" == "" goto doJpda if not "%SECURITY_POLICY_FILE%" == "" goto 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 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
是否是有点长,是否是有点看不懂,是否是以为很麻烦,不要着急,我想一个办法,更直观的观察这里面到底是什么东西:下面我在这些脚本上添点东西,弄成这个样子:
rem Execute Java with the applicable properties if not "%JPDA%" == "" goto doJpda if not "%SECURITY_POLICY_FILE%" == "" goto 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% echo 1 %_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% echo 2 %_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 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% echo 3 %_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% echo 4 %_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 pause
其实很简单,就是把内容输出,而后为了能看清,我在后面加了个pause,嘿嘿,下面我从startup.bat启动catalina.bat之后看输出结果:
Using CATALINA_BASE: "F:\apache-tomcat-7.0.8"
Using CATALINA_HOME: "F:\apache-tomcat-7.0.8" Using CATALINA_TMPDIR: "F:\apache-tomcat-7.0.8\temp" Using JRE_HOME: "E:\Program Files\Java\jdk1.7.0_40" Using CLASSPATH: "F:\apache-tomcat-7.0.8\bin\bootstrap.jar;F:\apache-tomca t-7.0.8\bin\tomcat-juli.jar" 1 start "Tomcat" "E:\Program Files\Java\jdk1.7.0_40\bin\java" -Djava.util.loggi ng.config.file="F:\apache-tomcat-7.0.8\conf\logging.properties" -Djava.util.logg ing.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs="F:\apa che-tomcat-7.0.8\endorsed" -classpath "F:\apache-tomcat-7.0.8\bin\bootstrap.jar; F:\apache-tomcat-7.0.8\bin\tomcat-juli.jar" -Dcatalina.base="F:\apache-tomcat-7. 0.8" -Dcatalina.home="F:\apache-tomcat-7.0.8" -Djava.io.tmpdir="F:\apache-tomcat -7.0.8\temp" org.apache.catalina.startup.Bootstrap start 请按任意键继续. . .
分析一下结果得出以下结论:
_EXECJAVA=start "Tomcat" "E:\Program Files\Java\jdk1.7.0_40\bin\java" JAVA_OPTS= -Djava.util.logging.config.file="F:\apache-tomcat-7.0.8\conf\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager CATALINA_OPTS= DEBUG_OPTS= -Djava.endorsed.dirs="F:\apache-tomcat-7.0.8\endorsed" -classpath "F:\apache-tomcat-7.0.8\bin\bootstrap.jar;F:\apache-tomcat-7.0.8\bin\tomcat-juli.jar" -Dcatalina.base="F:\apache-tomcat-7.0.8" -Dcatalina.home="F:\apache-tomcat-7.0.8" -Djava.io.tmpdir="F:\apache-tomcat-7.0.8\temp" MAINCLASS=org.apache.catalina.startup.Bootstrap CMD_LINE_ARGS= ACTION=start
至于其余状况,你们本身研究吧,但愿能起到抛砖引玉的做用。在文中有三处疑问(标红加粗字体),因为和本文关心不太大,在之后说明,若是谁愿意交流也能够写在评论中,昨天晚上写了这些,脑壳都混乱了,好像若是有不正确的地方,欢迎你们指认。