tomcat服务启动解析

[web容器简介]

先需要区分几个概念:Web Server 、Web Container

Web Server:能够通过HTTP提供服务的进程,可以是一套完整的系统、一个软件等

Web Container:管理Java Servlet、JSP的容器,是Web Server的一个组件。一般负责,负责管理servlet的生命周期,url请求映射,请求权限验证等。

常见的web容器包括:

Apache Tomcat、GlassFish、Jetty、JBoss , etc.(Open Source)

Sun GlassFish Server、WebLogic Application Server、IBM WebSphere,etc.(Commerical)

reference wikipedia.org: http://en.wikipedia.org/wiki/Web_container

[tomcat容器启动]

从catalina.sh中可以看出,tomcat启动的入口和参数配置,下面是执行catalina.sh脚本时,打印出来的详细信息

exec /home/work/local/jdk1.6.0_31/bin/java -Djava.util.logging.config.file=/home/work/local/apache-tomcat-

6.0.35/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xm

s8000m -Xmx8000m -Xmn6000m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:SurvivorRatio=4 -Xss1024K -verbose:gc

-XX:-DisableExplicitGC -Xloggc:/logs/gc.log -Djava.awt.headless=true -Dfile.encoding=gbk -Dcom.sun.managemen

t.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.mana

gement.jmxremote.authenticate=false -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,add

ress=8764,server=y,suspend=n -Djava.endorsed.dirs=/home/work/local/apache-tomcat-6.0.35/endorsed -classpath

/home/work/local/apache-tomcat-6.0.35/bin/bootstrap.jar -Dcatalina.base=/home/work/local/apache-tomcat-6.0.3

5 -Dcatalina.home=/home/work/local/apache-tomcat-6.0.35 -Djava.io.tmpdir=/home/work/local/apache-tomcat-6.0.

35/temp org.apache.catalina.startup.Bootstrap start

中间部分是参数,简化之后,相当于启动tomcat服务器的命令是

java org.apache.catalina.startup.Bootstrap start

同时设置了几个后续会用到的系统变量如下

catalina.base  =  /home/work/local/apache-tomcat-6.0.35

catalina.home  =  /home/work/local/apache-tomcat-6.0.35

在Bootstrap加载时,会通过这两个系统变量来设置其成员变量

private static final File catalinaBaseFile;

private static final File catalinaHomeFile;

这里,它们都指向同一个目录

从Apache Tomcat官网

(https://tomcat.apache.org/tomcat-8.0-doc/architecture/startup.html)上找出服务启动时的时序图如下

对照Bootstrap类的源码进行解析,源码版本(tomcat-catalina-8.0.20)

initClassLoaders()

初始化tomcat服务的classloader,用于后续类的加载。

tomcat有3个classloader:commonLoader、catalinaLoader和sharedLoader。commonLoader是catalinaLoader和sharedLoader的父loader。

commonLoader的名字是common.loader,在配置文件(catalina.properties)中,指向的路径是

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"。最后的效果是,commonLoader加载类时,会从tomcat的lib目录,以及lib目录中的jar文件去寻找。

catalinaLoader和sharedLoader如果没有设置,默认情况下会指向commonLoader,也就是它们三个实际上都指向了同一个ClassLoader对象,从同一个地方去加载类。

newInstance()

加载Catalina类,生成Catalina对象

这里会用到在上一步初始化的catalinaLoader来加载,

Class<?> startupClass =

catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");

Object startupInstance = startupClass.newInstance();

setParentClassLoader()

设置生成的Catalina对象的父类加载器

Catalina有一个parentClassLoader属性设置为sharedLoader

String methodName = "setParentClassLoader";

paramValues[0] = sharedLoader;

Method method =

startupInstance.getClass().getMethod(methodName, paramTypes);

method.invoke(startupInstance, paramValues);

load()

为Catalina对象加载配置,启动tomcat服务

通过反射调用Catalina对象的load方法,加载并解析配置文件,启动tomcat服务。

Catalina的load方法中做的操作较多,下面进行分解:

a、调用initDirs和initNaming()做tmp路径和命名的初始化。

b、调用 createStartDigester();生成Digester对象。Digester类负责进行配置文件的解析。

c、加载配置文件(server.xml),获取输入流InputStream对象

d、利用Digester解析配置文件输入流,解析之后,获取配置的root节点表示对象。也就是Server对象。server.xml的根节点就是<server>标签

e、对上一步生成的server对象进行初始化,启动服务

总结下,在Tomcat服务启动时需要加载的内容

1、     加载配置文件catalina.properties

2、     设置ClassLoader,从配置文件获取类的加载路径

3、     利用ClassLoader,加载org.apache.catalina.startup.Catalina

4、     Catalina加载并解析server.xml文件

时间: 2024-10-06 09:34:53

tomcat服务启动解析的相关文章

tomcat服务启动失败系统提示错误代码4

[问题描述]tomcat服务启动失败,系统提示错误代码4.[原因分析]查找tomcat的logs目录下stdout.log日志,发现一句话: Error occurred during initialization of VMCould not reserve enough space for object heap翻译:VM初始化时发生错误无法为对象堆保留足够的空间 于是,猜测是配置的jvm内存问题,即jvm启动时内存不足引起.[解决办法]打开注册表,修改jvm内存设置,JvmMs和JvmMx

Windows下使用service.bat安装tomcat服务, 启动停止tomcat服务

在项目开发过程中,以前只是在MyEclipse中配置.启动.停止tomcat服务器 如果只想在机器中使用tomcat服务器,而不想安装MyEclipse,可以使用service.bat 将tomcat安装到计算机中的服务管理系统services.msc,就可以使用DOS命令启动或 停止tomcat服务. 一般在tomcat的bin目录下有service.bat文件,如果没有就去下载一个有此文件 的tomcat. 一.win + R.cmd.Enter    打开cmd窗口, 此时工作目录是在C盘

配置tomcat 服务 启动模式

1配置Tomcat的环境变量,其步骤如下: 计算机右击属性,打开环境变量---系统变量---新建变量名:CATALINA_HOME,变量值为:D:\Program Files\Apache Software Foundation\Tomcat 8.0(具体看Tomcat的安装路径),如下图: 打开PATH,添加变量值:%CATALINA_HOME%\lib;%CATALINA_HOME%\bin,如下图: 2.设置服务器内存cmd命令行界面进入Tomcat解压目录的bin目录 打开service

tomcat服务启动与停止的监听

1:首先需要导入的包 2:在web.xml中添加监听 3: ServletContextListener监听ServletContext.当创建ServletContext时,激发 contextInitialized(ServletContextEvent sce)方法:当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法.用这个监听器,tomcat启动和停止前你想干什么干什么 package com.eoopen.l

Tomcat服务启动脚本

#!/bin/bash source /usr/local/application/tomcat/.bash_profile TOMCAT_NAME=tomcat7 TOMCAT_HOME=/usr/local/application/tomcat/tomcat7 TOMCAT_PID=`ps -ef | grep ${TOMCAT_NAME} | grep -v "grep" | awk '{print $2}'` usage(){   echo  -e "\e[1;32m

部署jenkins,采用普通用户tomcat来启动tomcat服务

安装jdk+tomcat,部署jenkins,采用普通用户tomcat来启动tomcat服务 1.环境说明 CentOS Linux release 7.3.1611 (Core) jdk1.8.0_60 apache-tomcat-8.5.23 已经安装好 2.编译安装服务守护程序 cd /usr/local/apache-tomcat-8.5.23/bin/ tar xf commons-daemon-native.tar.gz cd /usr/local/apache-tomcat-8.5

[BAT] BAT 顺序执行其他BAT 批处理文件可设置时间间隔(实际场景Windows下依次启动多个Tomcat服务)

BAT(Batch file) 批处理是个好东西,计算机石器时代的利器,时至今日仍然不落伍,工作中积累些常用的批处理命令还是很有用的,今天分享个实际开发中用到的. 场景: 需要在Windows下启动多个Tomcat服务,且需要第一个服务成功启动后才能启动第二个.第三个服务. 解决方法: 第一个服务判断是否启动成功,需要读取Tomcat的 Starup.bat 的输出内容,加以判断进行识别,较为繁琐,简化处理方式,就是第二个.第三个服务启动可与第一个设置时间间隔,如2分钟 120秒. Batch

window服务器下监控tomcat服务脚本

win下服务器tomcat检查,检测tomcat端口是否挂掉,如果挂掉自动重启.脚本如下 #include <File.au3>;tomcat目录$tomcatDir = "C:\ovk\apache-tomcat-7.0.55\bin\";vlc目录$vlcPath = "C:\Program Files\VideoLAN\VLC\vlc.exe";自办频道1 文件 文件名必须为ziban1.ts$ziban1Path = "C:\pingd

Vbs脚本定时判断及启动tomcat服务

说到tomcat服务,我们大家都会联系到apache,那apache和tomcat有什么区别呢,apache是web服务器(静态解析,如HTML),tomcat是java应用服务器(动态解析,如JSP.PHP)tomcat只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行,两者从以下几点可以比较的: 1.两者都是apache组织开发的 .2.两者都有HTTP服务的功能 .3.两者都是开源免费的 .当然对于一个java开发人员来