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

【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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring思维导图,让spring不再难懂(一)

转载自 Spring思维导图&#xff0c;让spring不再难懂&#xff08;一&#xff09; 摘要: Spring是一个开源框架&#xff0c;是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构&#xff0c;分层架构允许您选择使用哪一个组件&#xff0c;同时为 J2EE …

spring(7)spring mvc 的高级技术

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(7)spring mvc 的高级技术” 的相关知识&#xff1b;2&#xff09;本文将会看到如何编写控制器来处理文件上传&#xff0c;如…

Ubuntu下MySQL、Redis以及MongoDB三个数据库的启动、重启以及停止命令

一、MySQL #启动 /etc/init.d/mysql start #停止 /etc/init.d/mysql stop #重启 /etc/init.d/mysql restart 二、Redis #启动 redis-server #停止 pkill redis-server三、MongoDB #启动服务 sudo service mongod start #重启 sudo service mongod restart #终止 sudo serv…

Spring思维导图,让Spring不再难懂(mvc篇)

转载自 Spring思维导图&#xff0c;让Spring不再难懂&#xff08;mvc篇&#xff09;spring mvc简介与运行原理Spring的模型-视图-控制器&#xff08;MVC&#xff09;框架是围绕一个DispatcherServlet来设计的&#xff0c;这个Servlet会把请求分发给各个处理器&#xff0c;并支持…

spring(10)通过spring 和 JDBC征服数据库

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(10)通过spring 和 JDBC征服数据库” 的相关知识&#xff1b;【1】 spring 的数据访问哲学1&#xff09;intro&#xff1a;s…

Ubuntu下apt-get方式Git的安装、配置和更新

一、首先命令行下载Git sudo apt-get update sudo apt-get install git 通过此种方式安装的git可能不是官方的最新版本&#xff0c;通过 git --version 查看版本信息&#xff0c;然后与git官网比对官网下载地址 二、然后配置git的帐号信息 git config --global user.name &q…

Spring思维导图,让Spring不再难懂(cache篇)

转载自 Spring思维导图&#xff0c;让Spring不再难懂&#xff08;cache篇&#xff09; 关于缓存 缓存是实际工作中非常常用的一种提高性能的方法。而在java中&#xff0c;所谓缓存&#xff0c;就是将程序或系统经常要调用的对象存在内存中&#xff0c;再次调用时可以快速从内存…

intro to JNDI

【0】README 1&#xff09;本文转自 http://sishuok.com/forum/blogPost/list/1186.html 【1】原文如下 1&#xff09;JNDI 是什么&#xff1f; JNDI是 Java 命名与目录接口&#xff08;Java Naming and Directory Interface&#xff09;&#xff0c;在J2EE规范中是重要的规范之…

Mybatis3配置方法

一.准备 1.三个Jar包&#xff0c; 1.mybatis-3.2.1.jar 2.mysql-connector-java-5.1.12-bin.jar 3.log4j-1.2.17.jar 2.vo类对象 public class SysUser {private Long id;private String name;private String loginName;private String password;private String avatar;/** ge…

小白学数据:教你用Python实现简单监督学习算法

转载自 小白学数据&#xff1a;教你用Python实现简单监督学习算法今天&#xff0c;文摘菌想谈谈监督学习。监督学习作为运用最广泛的机器学习方法&#xff0c;一直以来都是从数据挖掘信息的重要手段。即便是在无监督学习兴起的近日&#xff0c;监督学习也依旧是入门机器学习的钥…

Spring_01_IoC初级总结

1.IoC简介 (转载) (原文&#xff1a;http://jinnianshilongnian.iteye.com/blog/1413846) via:jinnianshilongnian 1.1、IoC是什么 Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&#xff0c;而是一种设计思想。在Java开发中&#xff0c;Io…

深度学习工具caffe详细安装指南

转载自 深度学习工具caffe详细安装指南前言&#xff1a; 在一台系统环境较好的linux机器上可以很容易的安装caffe&#xff0c;但是如果系统本身很旧&#xff0c;又没有GPU的话&#xff0c;安装就太麻烦了&#xff0c;所有都得从头做起&#xff0c;本文档旨在尽可能覆盖安装所要…

Spring_02_AOP初级总结

1.AOP简介 是对OOP编程方式的一种补充。翻译过来为“面向切面编程”。 可以理解为一个拦截器框架&#xff0c;但是这个拦截器会非常武断&#xff0c;如果它拦截一个类&#xff0c;那么它就会拦截这个类中的所有方法。如对一个目标列的代理&#xff0c;增强了目标类的所有方法…

spring(11)使用对象-关系映射持久化数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(11)使用对象-关系映射持久化数据” 的相关知识&#xff1b;【2】spring 与 java 持久化API1&#xff09;intro&#xff1a;…

漫画:什么是数据仓库

转载自 玻璃猫 算法与数据结构一个故事 在很久很久以前&#xff0c;世界上生活着许多种族&#xff0c;有人类&#xff0c;有矮人&#xff0c;有精灵......他们有着不同的信仰&#xff0c;不同的文化&#xff0c;彼此相安无事。可是&#xff0c;有一个猥琐男却偏偏想要统治整个世…

SpringMVC_初级总结

1.SpringMVC的工作原理 浏览器发出一个http请求给服务器&#xff0c;如果匹配DispatcherServlet的请求映射路径&#xff08;在web.xml中指定&#xff09;&#xff0c;服务器将请求转交给DispatcherServlet.DipatcherServlet接收到这个请求之后&#xff0c;根据请求的路径&#…

tomcat中配置jndi数据源以便spring获取

【0】README0&#xff09;intro to jndi&#xff0c; plase visit intro to jndi&#xff1b;1&#xff09;本文译自 Configuring Spring MVC JdbcTemplate with JNDI Data Source in Tomcat&#xff1b;2&#xff09;本文旨在分析如何通过springmvc 获取 JNDI 数据源 以连接到…

Machine Learning:十大机器学习算法

转载自 Machine Learning&#xff1a;十大机器学习算法摘要: - 机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 - 基本的机器学习算法&#xff1a;线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强 机…

Java的值传递解析

值传递与引用传递 最近学基础的时候&#xff0c;老师讲了值传递和引用传递&#xff0c;这个问题一直不太明白&#xff0c;上网查了很多资料&#xff0c;按照自己的理解整理了一遍&#xff0c;发现之前不太明白的地方基本上想明白了&#xff0c;如有不正确的地方&#xff0c;欢…

spring(13)缓存数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(13)缓存数据” 的相关知识&#xff1b;2&#xff09;缓存&#xff1a;缓存可以存储经常会用到的信息&#xff0c;这样每次需…