查看tomcat启动文件都干点啥
以下所写的都是基于Windows 操作系统,tomcat7.0版本。一直在使用tomcat但是老实说对于tomcat本身并没有一个系统的掌握,今天饶有兴致的随便看了看,做了一点笔记,写一点心得,我本人比较喜欢从表面出发,从使用出发,然后再深入到它的本质问题上。
在windows操作系统中,我们运行tomcat只需要执行startup.bat脚本就好,简单的很,但是startup.bat这个脚本做些什么,我是真的不知道的,所以今天我就说说startup.bat这个脚本都有什么内幕在里面。首先我们看一下startup.bat的内容是什么:
@echo off
rem Licensed to the Apache Software Foundation (ASF) under one or more
rem contributor license agreements. See the NOTICE file distributed with
rem this work for additional information regarding copyright ownership.
rem The ASF licenses this file to You under the Apache License, Version 2.0
rem (the "License"); you may not use this file except in compliance with
rem the License. You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License. if "%OS%" == "Windows_NT" setlocal
rem ---------------------------------------------------------------------------
rem Start script for the CATALINA Server
rem
rem $Id: startup.bat 895392 2010-01-03 14:02:31Z kkolinko $
rem --------------------------------------------------------------------------- rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec 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 call "%EXECUTABLE%" start %CMD_LINE_ARGS% :end
如果熟悉语法,那么对这个脚本的内容了解起来就很容易,不幸的是,我不熟悉,所以我只能一点一点的看了,从头开始:
第1行:echo off是一个批处理命令,作用就是关闭输出所执行的批处理操作的所执行的命令,前面加上@就是连echo off这条命令也不显示,看一下下面这个例子,我在D盘创建一个脚本文件test.bat,文件中的内容如下:
C:
dir
我运行此脚本,执行结果如下:

当在test.bat脚本上加上echo off以后,
echo off
c:
dir
执行结果 如下:

有没有发现,其中的c:和dir命令都已经不现实了,知识现实了一个echo off命令,如果加上@echo off那么连echo off命令都不现实:
@echo off
c:
dir
执行结果如下:

发现所有执行的命令都没有现实,知识输出了命令的执行结果。
下面看第17行:
if "%OS%" == "Windows_NT" setlocal
可以判断这是一个判断语句,如果%OS% == "Windows_NT" 那么执行setlocal,这里面有两个不好理解的东西,%OS%为何物,setlocal又是做了什么事情,%%是从操作系统的环境变量中读取信息,我们可以看一下,在操作系统中,应该有个OS环境变量,

下面我们来尝试一下,同样在test.bat中加入测试内容:
@echo off
echo %OS%
echo %Path%
查看执行结果:

不出意料果然是在读取环境变量中的内容,但是当我把环境变量中的内容作修改以后呢?

查看执行结果:

发现此时%OS%已经改变。下来需要看看setlocal这个命令做了些什么操作,下面看一下在microsoft网站上对于setlocal的讲解,setlocal:
Starts localization of environment variables in a batch file. Localization continues until a matching endlocal command is encountered or the end of the batch file is reached.
在批处理文件中环境变量的本地化操作。意思就是在setlocal命令执行以后,对于环境变量所做的修改只是对于本批处理文件有影响,这个影响直到对应的endlocal命令,或者批处理文件结尾处时消除。举例子证明一下:
@echo off
setlocal
path=g:\programs\superapp;%path%
echo %Path%
endlocal
echo %Path%
如果按照上面的说法,两次输出的%Path%应该不一样,第一次比第二次多输出g:\programs\superapp,下面看结果

所以if "%OS%" == "Windows_NT" setlocal的意思就是如果在环境变量中%OS%设置的是Windows_NT,那么就调用setlocal方法在本startup.bat这个批处理文件中,设置本地的环境变量。
下面看第25行
set "CURRENT_DIR=%cd%"
这个理解起来可能很简单,问题就是%cd%这个具体是什么值,只需要尝试一下:
@echo off
set "CURRENT_DIR=%cd%"
echo %CURRENT_DIR%
其实很简单,%cd%变量就是current_dir的简写,就是批处理文件运行的当前目录,由于startup.bat都运行在tomcat的bin目录下,所有我也将test.bat放到该目录下,在我的环境中,这个地址为,D:\apache-tomcat-7.0.52-src\bin,那么执行结果为:

下面看25行
if not "%CATALINA_HOME%" == "" goto gotHome
如果你习惯在操作系统中设置%CATALINA_HOME%这个环境变量,那么此刻执行到此处的时候,就会跳转到:gotHome节点下的语句中,
@echo off
if not "%CATALINA_HOME%" == "" goto gotHome
echo aaa
:gotHome
echo "gotHome"
输出结果:

但是我平时真的没有设置%CATALINA_HOME%这个环境变量的习惯,所以此处我将刚才添加的%CATALINA_HOME%环境变量去掉,所以在执行
if not "%CATALINA_HOME%" == ""这条语句的时候,返回的结果为false,所以顺序执行第26行:
下面看26行的内容:
set "CATALINA_HOME=%CURRENT_DIR%"
上面已经知道了%CURRENT_DIR%这个变量时在tomcat\bin目录,在我的环境下应该就是D:\apache-tomcat-7.0.52-src\bin,如何要是设置%CATALINA_HOME%这个变量的话,%CATALINA_HOME%的值应该是tomcat所在的目录。在我的环境下应该就是D:\apache-tomcat-7.0.52-src。
接下来查看27行的内容:
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
这个意思就是如果存在%CATALINA_HOME%\bin\catalina.bat这个批处理文件,那么就跳转到:okHome节点下面的代码中,如果这个文件不存在那么就顺序执行28行的代码,但是一般情况下,这个文件都是存在的,我也想不出什么情况下(排除人为删除),这个文件不存在,但是还是看一下28-30行的代码:
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
这个意思很明了,以我的环境为例,如果不存在D:\apache-tomcat-7.0.52-src\bin\catalina.bat文件,那么就到D:\apache-tomcat-7.0.52-src这个目录下,此时的%cd%的值应该为D:\apache-tomcat-7.0.52-src,设置CATALINA_HOME变量为D:\apache-tomcat-7.0.52-src,因为前面设置过%CURRENT_DIR%的值为D:\apache-tomcat-7.0.52-src\bin,所以在此进到D:\apache-tomcat-7.0.52-src\bin这个目录下。
下面是gotHome节点了,看一下gotHome节点的命令:
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
从上面的程序看来,如果设置了%CATALINA_HOME%变量,那么直接跳转到执行gotHome节点,如果没有定义这个变量的话就顺序执行到这来,gotHome主要做的工作就是判断%CATALINA_HOME%\bin\catalina.bat这个文件是不是存在,如果存在,那么到:okHome节点,如果不存在,那么输出错误信息,然后直接跳转到文件的末尾处,结束本次程序。下面请看cataline.bat文件存在的情况下,执行的:okHome节点的信息:
:okHome set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:ok节点的操作同样只是做了一下校验,把%CATALINA_HOME%\bin\catalina.bat赋值给变量EXECUTABLE,然后再做一次EXECUTABLE变量的校验,同样,如果校验成功的话,执行:okExec节点下的操作,如果不存在,输出相关的错误信息,然后直接跳转到文件的末尾处,结束本次执行。接下来的部分,不能分开说明,所以把45-53行拿出来一起说明:
:okExec 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 call "%EXECUTABLE%" start %CMD_LINE_ARGS% :end
将:setArgs节点下的返回结果赋值给CMD_LINE_ARGS变量。在:setArgs的第一条命令,如果%1也就是第一个参数为空,那么直接跳转到:doneSetArgs节点,执行catalina.bat文件,此时应该没有传递参数。如果存在参数的话,那么就循环所有的参数,将所有的参数链接在一起,赋值给CMD_LINE_ARGS变量,然后执行catalina.bat文件,此时应该有传递参数。
到此关于tomcat在windows操作系统下的的启动文件startup.bat的分析就结束了,其实startup.bat文件的作用就是找到catalina.bat文件,然后把参数传递给它,至于catalina.bat文件都做了什么操作,等下一章在分析把。
查看tomcat启动文件都干点啥的更多相关文章
- 查看tomcat启动文件都干点啥---catalina.bat(转)
在上一次查看tomcat启动文件都干点啥一文中,我们总结出,startup.bat文件的作用就是找到catalina.bat文件,然后把参数传递给它,在startup.bat中,调用catalina. ...
- 查看tomcat启动文件都干点啥---catalina.bat
在上一次查看tomcat启动文件都干点啥一文中,我们总结出,startup.bat文件的作用就是找到catalina.bat文件,然后把参数传递给它,在startup.bat中,调用catalina. ...
- 查看tomcat启动文件都干点啥---server对象
在上一章查看tomcat启动文件都干点啥---Catalina.java中说道了构造Server,,这次尝试着说一下Tomcat中Server的内容,首先看一下org.apache.catalina. ...
- 查看tomcat启动文件都干点啥---Catalina.java
在前一章查看tomcat启动文件都干点啥---Bootstrap.java中我们得出结论,在Bootstrap中通过反射调用Catalina类中的getServer,start,stop,stopSe ...
- 查看tomcat启动文件都干点啥---Bootstrap.java
在上一章查看tomcat启动文件都干点啥---catalina.bat,说了在catalina.bat中都走了什么流程,最重要的是,我们得出了如下这段命令: _EXECJAVA=start " ...
- Linux下如何查看tomcat是否启动、查看tomcat启动日志
在Linux系统下,重启Tomcat使用命令的操作! 1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh ...
- Linux下如何查看tomcat是否启动、查看tomcat启动日志(转)
在Linux系统下,重启Tomcat使用命令的操作! 1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh ...
- 【linux】linux上 查看tomcat日志文件
1.查看实时日志文件 tail -f catalina.out 2.实时查看日志文件 最后n行 tail -n -f catalina.out 3.退出tail命令 ctrl + C 4.翻页查看 日 ...
- 如何查看tomcat启动异常日志详情
我的电脑同时使用两个jdk版本,默认1.7,eclipse使用的是1.8,,由于项目启动时有加载类需要jdk1.8的包,1.7不支持.所以导致项目在eclipse直接能够跑,而在外面的tomcat跑是 ...
随机推荐
- g++ 链接*.a静态库 方法
g++在链接*.a静态库时,直接作为object使用,不需要使用-l ,但是需要注意调整顺序,被依赖的文件放在后面. 如: g++ -g -o0 -Wno-deprecated -I$(INCL ...
- WPF ClickOnce应用程序IIS部署发布攻略
WPF程序非常适合公司内网使用,唯一缺点就是客户端要安装.net框架4.0.优势也很明显,在客户端运行的是一个WinForm程序,自动下载,可以充分利用客户机的性能,而且是以当前的Windows用户权 ...
- KVM-Introduce
相信非常多的人对虚拟机并不陌生,眼下也有非常多优秀的虚拟机软件,比如:VMware, VirtualBox, Xen, KVM等.而本文的主要内容是介绍KVM. KVM: Kernel Based V ...
- android中共享全局数据的方法
转自:http://blog.csdn.net/ameyume/article/details/6100756 我们在平时的开发中,有时候可能会需要一些全局数据,来让应用中的所有Activity和Vi ...
- [翻译] JFDepthView 给view提供3D景深
JFDepthView 给view提供3D景深 https://github.com/atljeremy/JFDepthView This is an iOS project for presenti ...
- WPF性能调试系列 – 应用程序时间线
WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profiler WPF内存优化:Ants Memor ...
- 如何利用Flink实现超大规模用户行为分析
如何利用Flink实现超大规模用户行为分析 各位晚上好,首先感谢大家参与我的这次主题分享,同时也感谢 InfoQ AI 前线组织这次瀚思科技主题月! 瀚思科技成立于 2014 年,按行业划分我们是 ...
- Python学习 —— 阶段综合练习二
综合之前的类的学习,做以下实例练习:(建议先不要看代码,自己先试着写:代码仅供参考,有多种实现方法) 1. Triangle & Equilateral 1). 创建class Triang ...
- poj 3258 River Hopscotch 题解
[题意] 牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 ...
- Javascript里面的时间处理:将时间戳或时间对象转成字符串格式
问题背景:想把一个时间直接转成字符串格式 通过查api发现有个toLocaleString(),根据本地时间格式,把 Date 对象转换为字符串 new Date().toLocaleString() ...