`
ss1
  • 浏览: 79800 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Catalina.bat脚本解析

阅读更多
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 种。

具体解释如下:

debug 在调试器中启动 Tomcat
debug -security 带有安全管理器的调试器中,调用 catalina 脚本来启动 Tomcat
jpda start 调用 catalina 脚本,在 JPDA 调试器中启动 Tomcat
run 在当前窗口内调用 catalina 脚本来启动 Tomcat (不切换窗口)
run -security 带有安全管理的情况下,在当前窗口内调用 catalina 脚本来启动 Tomcat (不切换窗口)
start 开始一个新的 DOS 窗口,并在其中启动 Tomcat (切换至新窗口)
start -security 带有安全管理的情况下,在新的 DOS 窗口中启动 Tomcat (切换至新窗口)
stop catalina 脚本执行停止命令来关闭 Tomcat
version 您使用的 Tomcat 版本

看完上面的解释,我们对 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.sun.com/j2se/1.5.0/docs/guide/security/smPortGuide.html ;如果您对 jpda 命令有兴趣,不妨浏览一下 http://java.sun.com/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


Rem 检查第二个命令参数是否为 -security ,我们没有第二个命令参数,脚本将执行至 execCmd 标签处
if not ""%1"" == ""-security"" goto execCmd
shift

echo Using Security Manager
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
goto execCmd

rem 执行 stop 命令,我们的第一个参数命令是 start ,下面这节将忽略不执行
:doStop
shift
set ACTION=stop
goto execCmd

rem 执行 version 命令,我们的第一个参数命令是 start ,下面这节将忽略不执行
:doVersion
%_EXECJAVA% -classpath "%CATALINA_HOME%\server\lib\catalina.jar" org.apache.catalina.util.ServerInfo
goto end


rem
执行命令,首先看看命令行参数是否不只一个,我们本例只有一个 start 参数,所以下面这节将不执行

: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 执行 java 命令行
rem Execute Java with the applicable properties
rem 检测 JPDA Security 变量,我们本例没有定义他们,下面两句将忽略
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity

rem 程序将执行下面的 java 命令,在新窗口内启动 Tomcat
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

Rem catalina 至此结束,下面代码我们将忽略。
goto end
:end

分享到:
评论

相关推荐

    解析Tomcat的启动脚本–catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本...这个脚本的代码有点多, 就单独弄了一篇展示 catalina.bat 脚本中的内容. 点击 [catalina.bat

    Tomcat中的catalina.bat原理详细解析

    **Tomcat中的`catalina.bat`是启动和管理Tomcat服务器的关键脚本,它位于Tomcat安装目录的`bin`子目录下。这个批处理文件主要负责设置环境变量、初始化Tomcat进程,并且处理与日志管理和远程调试等相关的工作。下面...

    Tomcat源码研究.pdf

    1. **Catalina.bat脚本解析** `Catalina.bat`是Windows环境下启动Tomcat的批处理脚本。这个脚本主要负责设置环境变量,初始化Java选项,并调用`catalina.sh`或`catalina.exe`来启动Tomcat服务。解析这个脚本有助于...

    解析Tomcat的启动脚本--startup.bat

    解析startup.bat脚本是理解Tomcat如何启动的第一步。这个简单的脚本实际上隐藏了许多在启动过程中需要进行的复杂检查和配置。通过理解这个脚本,我们可以更好地控制Tomcat的启动过程,并有效地处理可能出现的问题。 ...

    Tomcat中的startup.bat原理详细解析

    `catalina.bat`是Tomcat的核心启动脚本,它包含了更复杂的逻辑,如初始化Java环境、加载配置文件、启动Tomcat服务器等。如果`catalina.bat`无法找到,`startup.bat`将终止执行。 在确认`catalina.bat`存在后,`...

    tomcat源码分析

    1. **Catalina.bat脚本解析** `Catalina.bat` 是Tomcat在Windows环境下启动的批处理文件,主要负责设置环境变量、执行Java虚拟机(JVM)并加载Tomcat的核心类。解析这个脚本有助于理解Tomcat的启动过程,包括如何...

    tomcat-5.0.28.rar

    本篇文章将深入探讨Tomcat 5.0.28版本,解析其关键组件,以及如何通过STARTUP.BAT和SHUTDOWN.BAT脚本来启动和关闭服务。 1. Tomcat 5.0.28概述: Tomcat 5.0.28是Tomcat 5.x系列的一个稳定版本,它遵循Servlet 2.4...

    tomcat8.0源码+catalina-home.rar

    6. **bin**:包含启动和停止Tomcat的脚本,如catalina.sh/bat,startup.sh/bat,以及其它管理工具。 在深入源码之前,我们需要理解Tomcat的工作流程。当一个HTTP请求到达,Catalina会根据配置解析请求,然后通过...

    tomcat启动脚本

    在启动过程中,`catalina.sh/bat`会解析此文件以获取启动信息。 4. **`logging.properties`**:控制Tomcat的日志输出,包括级别、格式和目的地。通过修改此文件,可以定制服务器的诊断信息。 5. **`context.xml`**...

    Web项目打成war包部署Tomcat时运行startup.bat直接闪退部署失败的快速解决方案

    CATALINA_HOME定义了Tomcat的安装位置,如果这个变量未被设置,startup.bat在执行过程中将无法找到它依赖的catalina.bat等关键脚本文件。因此,需要检查并确保CATALINA_HOME已经配置,并指向正确的Tomcat安装目录。 ...

    [其他类别]WebSpider蓝蜘蛛网页抓取 v5.1_webspider(毕设 + 课设).zip

    它可能是基于Java开发的,因为压缩包中的文件包括了与Tomcat服务器相关的脚本,如`catalina.bat`,这是Tomcat服务器启动和停止的命令行脚本。这些脚本的出现意味着WebSpider可能利用了Tomcat作为其后端服务来运行...

    一台服务器上启动多个tomcat

    - 修改每个实例下的`catalina.bat`和`startup.bat`文件中的`CATALINA_BASE`变量,使其指向对应的实例路径。 #### 结论 在一台服务器上启动多个Tomcat实例主要是通过配置不同的端口号以及设置环境变量来实现。方法...

    把 MapXtreme for Java 迁移到 Tomcat 5.5 上

    具体操作是将原脚本备份并重命名,如将startup.bat和shutdown.bat分别改为startup41.bat和shutdown41.bat,然后创建新的startup55.bat和shutdown55.bat脚本,指向新版本的Catalina.bat,即Tomcat/bin目录下的启动...

    linux环境下验证码不显示问题

    ### Linux环境下验证码不显示问题解析 #### 一、问题背景及概述 在Linux环境中部署Web应用时,可能会遇到登录页面中的验证码无法正常显示的问题。这一现象不仅降低了用户体验,还可能导致用户无法正常登录系统,...

Global site tag (gtag.js) - Google Analytics