查看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跑是 ...
随机推荐
- hdu 3340 Rain in ACStar 线段树区间等差数列更新
Rain in ACStar Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1385 ...
- Android 按钮长按下去重复执行某个动作,放开后停止执行动作
Android开发中,常遇到一种需求,即按钮长按下去重复执行某个动作,放开后停止执行动作.网上找了许多代码,都没有适合的,于是自己动手写了一个. 基本思路是:首先设置一个标识变量,用于标识是否处于按下 ...
- DOM节点中属性nodeName、nodeType和nodeValue的区别 < Delphi >
http://msdn.microsoft.com/zh-cn/library/vstudio/hf9hbf87.aspx <?xml version="1.0"?> ...
- 字符串型MySQL查询条件需要注意的一点
最近在工作中遇到了数据库服务器产生很多读写队列的问题,于是要求大家开始优化我们的SQL语句. 下面是查询quotedata_history表中的code字段的SQL语句,其中code字段的类型是var ...
- dtrace for mysql
http://dtrace.org/blogs/brendan/2011/06/23/mysql-performance-schema-and-dtrace/
- 卸载oracle数据库
Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\OracleOr ...
- 定制NSLog便于打印调试
定制NSLog便于打印调试 本人之前从事过嵌入式开发,对于打印调试比较在行,现分享定制的NSLog以及教大家如何使用. 源码下载地址 https://github.com/YouXianMing/Y ...
- easyui icon的使用相关
easyui的默认图标有以下这些: .icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background: ...
- SQLAlchemy如何给列和表添加注释comment?
1.首先需要升级版本到1.2.x,我用的是1.2.14验证的,没有问题 2.看示例: class LoadResource(Base): """施压机资源."& ...
- 实现SQL Server中的切割字符串SplitString函数
有时我们要用到批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.没什么好说的,需要的朋友直接拿去用吧 SET ANSI_NULLS ON GO S ...