【0】README
1)本文部分文字描述转自:“深入剖析tomcat”,旨在学习“tomcat启动脚本分析”的相关知识;
2)for tomcat4 startup files, please visit https://github.com/pacosonTang/HowTomcatWorks/tree/master/supplement/tomcat4_bin
【1】Windows平台的启动脚本
1)分析catalina.bat 批处理文件的内容:(catalina.bat)
step1)首先使用 @echo off 命令隐藏命令的显示;
step2)然后检查环境变量OS的值是否为 “Windows_NT”;即用户使用的是否是 window os 的相应distribution;如果是,它就调用 setLocal 命令将对环境变量的修改控制在当前批处理文件中:

if "%OS%" == "Windows_NT" setlocal

step3)然后,如果先前没有设置变量 CATALINA_HOME 的值,就在这里进行设置。默认case下,变量 CATALINE_HOME 是不存在的;如果显然没有设置过变量 CATALINA_HOME,那么批处理文件会猜测是从哪个文件目录进行调用;(干货——设置 环境变量CATALINA_HOME的值,该值应该被正确设置为bin的父目录)
step3.1)首先,它会假设catalina.bat 文件是在安装目录中进行调用的。那么在bin目录下就一定存在一个 catalina.bat 的文件:
if not "%CATALINA_HOME%" == "" goto gotHome
set CATALINA_HOME=.
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

step3.2)如果在当前目录的子目录bin下没有找到catalina.bat 文件;批处理文件会再猜测一次;这次,它还会假设catalina.bat 文件是在安装目录的bin 命令下调用的,但是会将变量 CATALINA_HOME 设置为当前目录的父目录,并检查 catalina.bat 是否存在于 bin目录中;
set CATALINA_HOME=..
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

step3.3)如果这次猜测正确,就跳转到 okHome标签所在位置继续运行;否则,它输出错误消息,告诉用户变量 CATALINA_HOME 设置错误,并跳转到end标签所在位置。end标签在批处理文件的末尾,会退出脚本执行;
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome 

step3.4)如果CATALINE_HOME 设置正确,并且setenv.bat 文件存在的话,会调用 setenv.bat 批处理脚本来设置需要的环境变量。如果 setenv.bat 文件不存在,就输出错误消息;(干货——查看setenv.bat是否存在,存在的话就调用该文件设置环境变量)
rem Get standard environment variables
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"

step4)接下来,它检查 setclasspath.bat 是否存在?如果不存在,它输出一条错误消息,并跳转到end标签所在的位置,退出批处理文件;(干货——查看 setclasspath.bat文件是否存在,存在的话定义变量BASEDIR=%CATALINA_HOME%)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

step4.1)如果存在,它就定义变量 BASEDIR,并赋值为环境变量 CATALINA_HOME 的值,然后,调用 setclasspath.bat 批处理文件设置类路径:
:okSetclasspath
set BASEDIR=%CATALINA_HOME%
call "%CATALINA_HOME%\bin\setclasspath.bat"

step4.2)setclasspath.bat 文件会检查环境变量 JAVA_HOME 是否设置正确,并设置将会在 catalina.bat 批处理文件中所要用到的变量:(干货——调用setclasspath.bat 设置类路径
set JAVA_ENDORSED_DIRS=%BASEDIR%\common\endorsed
set CLASSPATH=%JAVA_HOME%\lib\tools.jar
set _RUNJAVA="%JAVA_HOME%\bin\java"
set _RUNJAVAW="%JAVA_HOME%\bin\javaw"
set _RUNJDB="%JAVA_HOME%\bin\jdb"
set _RUNJAVAC="%JAVA_HOME%\bin\javac"

step5)接下来,catalina.bat 文件会检查是否安装了 Java Secure Socket Extension(JSSE),以及环境变量 JSSE_home 是否设置正确。如果存在环境变量 JSSE_HOME,将其添加到环境变量CLASSPATH中:(干货——检查JSSE_home环境变量是否设置
if "%JSSE_HOME%" == "" goto noJsse
set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar
:noJsse

step5.1)如果没有设置环境变量 JSSE_HOME,批处理文件会继续执行下面的目录,将bin目录下的 bootstrap.jar 添加到 环境变量 CLASSPATH 中;
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar

step6)接下来,检查环境变量 CATALINA_BASE 是否设置,若没有设置则将 CATALINE_HOME的值赋给它;(干货——检查CATALINA_BASE 环境变量是否设置
if not "%CATALINA_BASE%" == "" goto gotBase
set CATALINA_BASE=%CATALINA_HOME%
:gotBase

step6.1)接着会检查变量 %CATALINA_TMPDIR% 是否设置,若没有设置的话,将其设置为 CATALINE_BASE 下的临时目录;
if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
set CATALINA_TMPDIR=%CATALINA_BASE%\temp
:gotTmpdir

step6.2)接着,显示一些变量的值;
echo Using CATALINA_BASE:   %CATALINA_BASE%
echo Using CATALINA_HOME:   %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
echo Using JAVA_HOME:       %JAVA_HOME%

step7)然后,它将 在setclasspath.bat 中设置的变量 _RUNJAVA 的值赋给 _EXECJAVA。(干货——为一些环境变量赋值)
set _EXECJAVA=%_RUNJAVA%

step7.1)它再设置如下的环境变量:
set MAINCLASS=org.apache.catalina.startup.Bootstrap // 设置启动目录;
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=

 public static void main(String args[]) {//org.apache.catalina.startup.Bootstrap.main().// Set the debug flag appropriatelyfor (int i = 0; i < args.length; i++)  {if ("-debug".equals(args[i]))debug = 1;}// Configure catalina.base from catalina.home if not yet setif (System.getProperty("catalina.base") == null)System.setProperty("catalina.base", getCatalinaHome());// Construct the class loaders we will needClassLoader commonLoader = null;ClassLoader catalinaLoader = null;ClassLoader sharedLoader = null;try {File unpacked[] = new File[1];File packed[] = new File[1];File packed2[] = new File[2];ClassLoaderFactory.setDebug(debug);unpacked[0] = new File(getCatalinaHome(),"common" + File.separator + "classes");packed2[0] = new File(getCatalinaHome(),"common" + File.separator + "endorsed");packed2[1] = new File(getCatalinaHome(),"common" + File.separator + "lib");commonLoader =ClassLoaderFactory.createClassLoader(unpacked, packed2, null);unpacked[0] = new File(getCatalinaHome(),"server" + File.separator + "classes");packed[0] = new File(getCatalinaHome(),"server" + File.separator + "lib");catalinaLoader =ClassLoaderFactory.createClassLoader(unpacked, packed,commonLoader);unpacked[0] = new File(getCatalinaBase(),"shared" + File.separator + "classes");packed[0] = new File(getCatalinaBase(),"shared" + File.separator + "lib");sharedLoader =ClassLoaderFactory.createClassLoader(unpacked, packed,commonLoader);} catch (Throwable t) {log("Class loader creation threw exception", t);System.exit(1);}Thread.currentThread().setContextClassLoader(catalinaLoader);// Load our startup class and call its process() methodtry {SecurityClassLoad.securityClassLoad(catalinaLoader);// Instantiate a startup class instanceif (debug >= 1)log("Loading startup class");Class startupClass =catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");Object startupInstance = startupClass.newInstance();// Set the shared extensions class loaderif (debug >= 1)log("Setting startup class properties");String methodName = "setParentClassLoader";Class paramTypes[] = new Class[1];paramTypes[0] = Class.forName("java.lang.ClassLoader");Object paramValues[] = new Object[1];paramValues[0] = sharedLoader;Method method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);// Call the process() methodif (debug >= 1)log("Calling startup class process() method");methodName = "process";paramTypes = new Class[1];paramTypes[0] = args.getClass();paramValues = new Object[1];paramValues[0] = args;method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);} catch (Exception e) {System.out.println("Exception during startup processing");e.printStackTrace(System.out);System.exit(2);}}

step8)接着,它会检查传入的第1个参数是否是 jpda(java platform debugger architecture);(干货——判断传入的第1个参数是否是 jpda)
step8.1)如果是:就设置变量 JPDA的值为 jpda,然后检查变量 JPDA_TRANSPORT 和 变量 JPDA_ADDRESS的值,并移动参数:
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

step8.2)大多数case下,不需要使用 JPDA,因此,第1个参数的值必须是以下几个中的一个: debug, embedded,run,start 或 stop;
:noJpdaif ""%1"" == ""debug"" goto doDebug
if ""%1"" == ""embedded"" goto doEmbedded
if ""%1"" == ""run"" goto doRun
if ""%1"" == ""start"" goto doStart
if ""%1"" == ""stop"" goto doStop

step8.3)如果第1个参数不正确,或没有使用参数,则该批处理文件会退出;
echo Usage:  catalina ( commands ... )
echo commands:
echo   debug             Start Catalina in a debugger
echo   debug -security   Debug Catalina with a security manager
echo   embedded          Start Catalina in embedded mode
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
goto end

step9)如果参数是start,则跳转到 doStart标签后,catalina.bat(它)会调用 shift命令来检查下一个参数;如果有第2个参数的话,那么它必须是 -security;否则,忽略它;如果下一个参数是 -security,会再次调用 shift命令,变量 SECURITY_POLICY_FILE 会被设置成为 %CATALINA_BASE%\conf\catalina.policy;(干货——如果运行catalina.bat 批处理文件的参数是start)
:doStart
shift
if not "%OS%" == "Windows_NT" goto noTitle
set _EXECJAVA=start "Tomcat" %_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

step9.1)跳转到 execCmd标签处:
goto execCmd

step9.2)execCmd标签下的 命令接收剩余未移动的命令行参数,将它们保存到 变量 CMD_LINE_ARGS 中,再跳转到 doneSetArgs 标签处:
: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

step9.3)下面是 doneSetArgs 标签处的代码
:doneSetArgs
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

对以上代码的分析(Analysis): 例如在pc上,调用catalina.bat 文件,上面的代码 会被转换为下面的实际代码:(从 %_EXECJAVA% 到 %ACTION%)
start "Tomcat" "C:\jdk1.8.0_60\bin\java" -Djava.endorsed.dirs="..\common\endorsed" -classpath "C:\jdk1.8.0_60\lib\tools.jar;..\lib\bootstrap.jar" -Dcatalina.base=".." Dcatalina.home=".." -Djava.io.tmpdir="..\temp" org.apache.catalina.startup.Bootstrap start

2)分析 startup.bat 批处理文件的内容:(其他startup.bat 是调用了 catalina.bat 文件)startup.bat

2.1)鉴于startup.bat 的 内容与 catlina.bat 文件的内容相似度较大,不不做分析,仅给出其源码;

@echo offrem   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 743401 2009-02-11 17:01:58Z markt $
rem ---------------------------------------------------------------------------rem Guess CATALINA_HOME if not defined
if not "%CATALINA_HOME%" == "" goto gotHome
set CATALINA_HOME=.
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
set CATALINA_HOME=..
: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
:okHomeset EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat  // 设置 catalina.bat 到 EXECUTABLE.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
:okExecrem 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
:doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS% // highlight line.:end

tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例)相关推荐

  1. 第一章 Hadoop启动Shell启动脚本分析--基于hadoop-0.20.2-cdh3u1

    我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 第一章 Hadoop启动Shell启动脚本分析 第一节 start-all.sh脚 ...

  2. Tomcat学习总结(20)—— Tomcat启动脚本收藏

    前言 有这样一个场景,公司为了安全起见,需要对所有登录Linux服务器做安全限制,要求除了管理员其他要登录linux服务器的员工不能用最高权限账号登录,要创建新的用户,对目录及文件权限做出控制,只能对 ...

  3. Spark配置启动脚本分析

    2019独角兽企业重金招聘Python工程师标准>>> 今天想停止spark集群,发现执行stop-all.sh的时候spark的相关进程都无法停止.提示: no org.apach ...

  4. Tomcat启动脚本startup.sh分析

    一.分析说明     为了写出更加完善的tomcat启动方面的自动化脚本,健壮自己用于代码上线自动化部署的脚本,特分析下tomcat的bin目录下的starup.sh脚本,学习标准的sh脚本的编写方法 ...

  5. linux tomcat startup.sh,tomcat启动脚本startup.sh分析

    一.分析说明 为了写出更加完善的tomcat启动方面的自动化脚本,健壮自己用于代码上线自动化部署的脚本,特分析下tomcat的bin目录下的starup.sh脚本,学习标准的sh脚本的编写方法,从中吸 ...

  6. linux startup.sh文件所在目录,Tomcat启动脚本startup.sh分析

    一.分析说明 为了写出更加完善的tomcat启动方面的自动化脚本,健壮自己用于代码上线自动化部署的脚本,特分析下tomcat的bin目录下的starup.sh脚本,学习标准的sh脚本的编写方法,从中吸 ...

  7. tomcat启动流程分析

    前言 tomcat究竟在启动的时候做了哪些事情呢?从直观上讲,当tomcat启动完毕后,部署在tomcat里的项目,就可以通过外部的http形式进行访问了,但有个疑问是,为什么可以访问呢?其内部都做了 ...

  8. 应急响应 - Windows启动项分析,Windows计划任务分析,Windows服务分析

    「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏<网络安全入门到精通> Windows应急响应 ...

  9. busybox rootfs 启动脚本分析(一)

    imx6文件系统启动脚本分析.开机运行/sbin/init,读取/etc/inittab文件,进行初始化. 参考链接 http://blog.163.com/wghbeyond@126/blog/st ...

最新文章

  1. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示
  2. html 5 gif手机版,动画GIF在HTML5画布
  3. POJ1063 Flip and Shift
  4. ajax能拿到401axios无法拿到,解决axios.interceptors.response 401 403问题
  5. 洛谷——P1597 语句解析(两种解法)
  6. #Deep Learning回顾#之2006年的Science Paper
  7. spring-boot推送实时日志到前端页面显示
  8. HTML标记大全参考手册
  9. Unity学习心得3
  10. composer安装yii2框架提示“fxp/composer-asset-plugin”与composer版本不符
  11. 什么是 promise?
  12. 为什么不吃米和面之后,体重掉得比较快?答案或许不是你想的那样
  13. (转)一些jbx的配置
  14. 朋友圈动态折叠严重怎么办?一招教你破解!
  15. LLJ-300HS;LLJ-F(S)系列漏电继电器
  16. EOS 一周回顾(11.25-12.1)
  17. java笔试完一般多久给通知_笔试之后多久收到面试通知?
  18. 27位名校博士选择入职中学?!顶尖人才浪费了吗?
  19. android4.0 去掉虚拟按键 教程,Android 4.0 隐藏虚拟按键(导航栏)的方法
  20. vue VantUI组件初探 使用

热门文章

  1. P2596 [ZJOI2006]书架 无旋treap 按照排名分裂
  2. Educational Codeforces Round 106 (Rated for Div. 2) C. Minimum Grid Path 奇偶 + 思维
  3. cf1491C. Pekora and Trampoline
  4. 1022. 宠物小精灵之收服
  5. The Bottom of a Graph Poj 2553
  6. [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)
  7. [贪心专题]CF549G,CF351E,CF226D,CF1276C,CF1148E,CF798D
  8. 牛客-牛牛的猜球游戏
  9. P2657-[SCOI2009]windy数【数位dp,dfs】
  10. 【jzoj】2018.2.3NOIP普及组——D组模拟赛