当
startup
脚本完成环境变量的设置后,就开始调用
catalina.bat
脚本来启动
Tomcat
。
Catalina
脚本的主要任务是根据环境变量和不同的命令行参数,拼凑出完整的
java
命令行,调用
Tomcat
的主类
org.apache.catalina.startup.Bootstrap
来启动
Tomcat
。我们先不解析该脚本,而是写一个简单的测试脚本来调用这个程序,看看测试结果,从而理解该脚本的调用方法。
测试脚本如下: rem 请将 JAVA_HOME 环境变量修改到您的 JDK 安装目录 set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09 rem 请将 CATALINA_HOME 环境变量修改到您的 Tomcat 安装目录 set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28 rem 开始调用 catalina.bat 文件 call %CATALINA_HOME%\bin\catalina.bat 我们把上面的脚本保存为 start_tomcat_nothing.bat 文件,然后在 MS-DOS 下执行,我们将看到如下的执行结果。 这个脚本并没有成功启动 Tomcat ,但是它给我们提供调用 catalina.bat 脚本的方法,请阅读上面窗口中的加亮部分。 Catalina.bat 的调用方法为 catalina 后面加上具体命令参数,这个命令参数有以下 9 种。 具体解释如下:
看完上面的解释,我们对 Tomcat 的启动参数有所了解。好,咱们写一个最简单的脚本来测试一下,拷贝刚才 start_tomcat_nothing.bat 脚本,将它重新命名为 start_tomcat_version.bat ,该脚本的内容和 start_tomcat_nothing.bat 脚本几乎一致,只是最后一行多加了一个 version 命令, start_tomcat_version.bat 脚本全部内容如下: rem 请将 JAVA_HOME 环境变量修改到您的 JDK 安装目录 set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09 rem 请将 CATALINA_HOME 环境变量修改到您的 Tomcat 安装目录 set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28 rem 开始调用 catalina.bat 文件 call %CATALINA_HOME%\bin\catalina.bat version 我们可以在 DOS 下观察该脚本的执行结果。 该脚本顺利执行,执行的结果告诉我们当前 Tomcat 的版本号为 5.0.28 。有兴趣的读者朋友可以试试其它的 8 个命令参数,这些命令参数有时对我们非常有用。举例来说,有时候我们正常启动 Tomcat 时, Tomcat 弹出一个 DOS 窗口,但是瞬间消失,我们看不出到底哪里出了问题,也无任何启动日志可看。在这种情况下,我们可以使用 run 命令在同一个窗口内启动 Tomcat ,不让 Tomcat 弹出新的 DOS 窗口,好让我们看看 Tomcat 到底为什么没有启动。测试这个问题的简单方法如下。 首先,请到 Tomcat 安装目录下的 bin 子目录,把 Tomcat 的启动 jar 文件 bootstrap.jar 重命名为 bootstrap_1.jar ,然后点击 startup.bat 文件启动,我们会看到一个小黑窗口闪了一下,但是 Tomcat 并没有正常启动,这是因为 startup.bat 执行的是 Tomcat 的缺省命令 start ,该命令将在开始一个新的 DOS 窗口,并在其中启动 Tomcat 。在这种情况下,我们就要借重于 run 命令了,我们改以下我们上面的 start_tomcat_version.bat 脚本,将 version 命令改为 run 命令,然后另存为 start_tomcat_run.bat ,该脚本全部内容如下: rem 请将 JAVA_HOME 环境变量修改到您的 JDK 安装目录 set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09 rem 请将 CATALINA_HOME 环境变量修改到您的 Tomcat 安装目录 set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28 rem 开始调用 catalina.bat 文件 call %CATALINA_HOME%\bin\catalina.bat run 脚本的执行结果如下: 请观察上面窗口中的加亮部分,这部分向我们清楚地展示 Tomcat 的启动错误,没有找到 Tomcat 的启动主类 Bootstrap 。这是因为我们人为地把 Tomcat 的启动 jar 文件包从 bootstrap.jar 重命名为 bootstrap_1.jar ,这个 bootstrap.jar 文件既然不存在,那包含在这个文件的 Bootstrap.class 文件当然也就找不到了。 现在,我们再回过头看看这个 catalina.bat 脚本。为简单起见,我们假定该脚本带缺省命令行参数 start ,看看 catalina 脚本的执行流程。如果您对 catalina 的 security 命令有兴趣,请参考 Sun 公司的文档 http://java./j2se/1.5.0/docs/guide/security/smPortGuide.html ;如果您对 jpda 命令有兴趣,不妨浏览一下 http://java./javase/technologies/core/toolsapis/jpda/ 文档。让我们打开 catalina 脚本,首先请注意这个脚本第二行有一个 setlocal 的命令,这个命令表明 catalina 中的环境变量只在本脚本中起作用,对其它程序和命令不起作用,这就意味着这个脚本中的环境变量是局部变量,不是全局变量,不会影响其它脚本和操作系统环境。 然后我们会看到长达 34 行的注释,这是优秀程序员必须学会的基本功之一。这些注释写得非常简洁明了,详细说明了各个环境变量的意义和用途。紧接着,如果发现 CATALINA_HOME 变量没有定义,该脚本试图设置该变量,这和 startup.bat 的第一节完全类似,在此不再赘述。然后该脚本调用 setclasspath.bat 到 JAVA_HOME 的 bin 目录下寻找 java.exe 、 javaw.exe 、 jdb.exe 和 javac.exe 所在的路径,并把这些 exe 文件的文件名和路径赋值到相应的环境变量 _RUNJAVA 、 _RUNJAVAW 、 _RUNJDB 和 _RUNJAVAC 中。再接下来, catalina 脚本判断是否定义有环境变量 CATALINA_BASE , CATALINA_TMPDIR ,如果定义了它们,就执行相应的操作。因为我们在此并没有定义它们,所以执行不到这些操作。然后, catalina 脚本将在本窗口内打印出四个环境变量的值,这四个环境变量我们非常熟悉,一旦启动 Tomcat ,我们必定能看到 CATALINA_BASE , CATALINA_HOME , CATALINA_TMPDIR 和 JAVA_HOME 。然后 catalina 脚本根据其后跟的不同命令,拼凑出完整的 JAVA 命令行并执行。下面是该脚本的详细注释: Rem 获得标准的环境变量,因为 setenv.bat 不存在,所以下面这两句不执行 rem Get standard environment variables if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" Rem 调用 setclasspath.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
set BASEDIR=%CATALINA_HOME% call "%CATALINA_HOME%\bin\setclasspath.bat" rem 根据不同情况在 classpath 中加上不同的 jar 包 rem Add on extra jar files to CLASSPATH if "%JSSE_HOME%" == "" goto noJsse set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar :noJsse Rem 注意下面的这个 jar 文件是 tomcat 的启动包 set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar rem 我们没有定义 CATALINA_BASE ,下面这节不执行 if not "%CATALINA_BASE%" == "" goto gotBase set CATALINA_BASE=%CATALINA_HOME% :gotBase rem 我们没有定义 CATALINA_ TMPDIR ,下面这节将忽略 if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir set CATALINA_TMPDIR=%CATALINA_BASE%\temp :gotTmpdir Rem 打印 4 个我们非常熟悉的环境变量 rem ----- Execute The Requested Command --------------------------------------- echo Using CATALINA_BASE: %CATALINA_BASE% echo Using CATALINA_HOME: %CATALINA_HOME% echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR% echo Using JAVA_HOME: %JAVA_HOME% rem 定义一些环境变量 set _EXECJAVA=%_RUNJAVA% rem 这是 Tomcat 启动的主类 set MAINCLASS=org.apache.catalina.startup.Bootstrap rem 这是 catalina 脚本的缺省命令 start set ACTION=start set SECURITY_POLICY_FILE= set DEBUG_OPTS= set JPDA= rem 我们的第一个参数命令是 start ,下面这节将忽略不执行 if not ""%1"" == ""jpda"" goto noJpda set JPDA=jpda if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport set JPDA_TRANSPORT=dt_shmem :gotJpdaTransport if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress set JPDA_ADDRESS=jdbconn :gotJpdaAddress shift :noJpda rem 我们的第一个参数命令是 start ,所以程序将走到 doStart 标签处执行 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 rem 如果 catalina 后跟的命令不是 debug, run, start, stop 或 version , rem 该脚本将打印出 catalina 的用法,然后结束。 Rem 详情请见我们前面的测试脚本 start_tomcat_nothing.bat 及相应的结果窗口 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 rem 执行 debug 命令,我们的第一个参数命令是 start ,下面这节将忽略不执行 :doDebug shift set _EXECJAVA=%_RUNJDB% set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\jakarta-tomcat-catalina\catalina\src\share" 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 rem 执行 start 命令 :doStart Rem 将参数列表指针指向下一个参数 shift rem 设置 Tomcat 启动窗口的标题,缺省值为 Tomcat if not "%OS%" == "Windows_NT" goto noTitle set _EXECJAVA=start "Tomcat" %_RUNJAVA% goto gotTitle :noTitle set _EXECJAVA=start %_RUNJAVA% :gotTitle
|
|