1.Tomcat源码分析— Bootstrap启动流程
2.maven之Tomcat启动错误锦集
3.Tomcat9.0ï¼
4.Servlet源码和Tomcat源码解析
5.ubuntu下查看tomcat运行状态
Tomcat源码分析— Bootstrap启动流程
在探讨Tomcat启动流程之前,源码需要理解其组件及其周期状态,源码这为后续深入学习组件初始化与启动等提供了基础。源码
实现Lifecycle接口的源码组件拥有种状态。Bootstrap作为Tomcat启动入口类,源码负责构造类加载器以加载Catalina内部类,源码档案借阅源码通过查找catalina.home目录下所有jar包,源码确保安全地加载应用程序类。源码
通过Bootstrap的源码main方法启动Tomcat实例,主要步骤包括创建Bootstrap对象、源码调用init方法,源码并根据启动参数执行load和start方法。源码
Bootstrap的源码init方法初始化类加载器,使得Tomcat能加载应用程序类,源码同时设置当前线程上下文加载器为CatalinaLoader。源码initClassLoaders方法创建三种类加载器,其中catalinaLoader与sharedLoader的父加载器为commonLoader。完成初始化后,预加载tomcat和javax包下的自定义类,避免访问权限异常。
调用catalinaLoader加载器加载Catalina类,通过反射实例化对象,并设置sharedLoader实例作为入参,最后将实例化的Catalina对象赋予catalinaDaemon成员变量。
Tomcat组件的初始化主要在load方法中完成,通过反射调用Catalina的load方法,构建并初始化StandardServer及其子组件。赫莲娜海南离岛溯源码Bootstrap.load方法通过反射调用Catalina的load方法,Catalina的load方法实现序列图中的逻辑,初始化配置文件解析器Digester,构建standardServer实例,绑定当前catalina实例,设置根路径,并调用init方法完成初始化。
Tomcat中的容器或组件使用模板方法设计模式,子类通过重写LifecycleBase抽象类的模板方法initInternal实现初始化逻辑。LifecycleBase的init方法主要完成两件事:调用父类的LifecycleBase#init方法,由standerServer#initInternal方法执行实际初始化。init方法逻辑包括:执行LifecycleBase#initInternal抽象方法,由standardServer#initInternal方法完成初始化。
service组件的init方法主要初始化Connector连接器,连接器的初始化尤为重要。不同协议处理器如AjpAprProtocol、HttpNioProtocol的初始化流程将在后续文章中单独讲解。
Bootstrap类的main方法通过反射执行catalina实例的start方法,启动standardServer实例,使其监听端口并接收新请求。start方法主要逻辑包括启动Service、Engine容器、Executor执行器、MapperListener监听器、Connector连接器等组件。当启动成功后,还原源码原理图解创建并监听端口,Tomcat对外提供服务。
总结,Tomcat的启动流程清晰且依赖模板方法与责任链设计模式,理解这两种模式有助于更好地理解启动过程及代码。启动过程首先初始化各组件,如Server、Service、Engine容器、虚拟主机Host、上下文Context、Executor执行器、Connector连接器等,然后按顺序启动组件,成功后监听端口提供服务。
maven之Tomcat启动错误锦集
在Maven与Tomcat集成开发过程中,新手可能会遇到一系列启动问题。以下是这些问题及其解决策略:
1. 如果遇到jar包版本过高导致的启动错误,可以在pom.xml文件中降低对应jar包的版本号。
2. 如果依赖冲突引发异常,尝试在dependency标签中添加domain为provided,以避免本地jar包与导入jar包的冲突。
3. 升级Tomcat后,Web项目样式消失:可能是版本兼容性问题,检查并调整相关配置以确保与新Tomcat版本兼容。
4. "Could not resolve dependencies for project":检查项目依赖是国外网站源码在线否正确配置,确保所有依赖已成功下载和安装。
5. "java.lang.ClassNotFoundException: org.apache.catalina.startup.Bootstrap":确认Bootstrap类是否存在,可能需要更新或重新引入相关依赖。
6. "java.net.BindException: Address already in use: bind":检查Tomcat是否已在同一端口运行,如有则关闭或更改端口号。
7. "Failed to start component...":这通常是配置或部署问题,检查web.xml文件和contextPath设置是否正确。
8. "java.lang.IllegalArgumentException: Invalid character found in the request target":检查URL格式,确保符合RFC 和RFC 规范。
9. "java.lang.OutOfMemoryError: PermGen space":内存溢出,尝试增加JVM内存或优化代码以减少内存消耗。
. "java.lang.NoClassDefFoundError: org/apache/tomcat/util/descriptor/tld/TldParser":检查是否正确引入了相关TLD文件或jar包。
. "java.lang.UnsupportedClassVersionError: Unsupported major.minor version":检查项目的编译和运行版本是否匹配。
. "Could not find or load main class org.apache.catalina.startup.Bootstrap":确保Bootstrap类路径正确,可能需要重新打包或清理类路径。
以上是常见问题及其解决方法,如果你遇到其他问题,欢迎分享,我们将持续更新解决方案。
Tomcat9.0ï¼
j2eeæå¡å¨æåªäº
ä¼æå¨ç¥ï¼J2EEåºç¨æå¡å¨ç¾è±é½æ¾ï¼ç§ç±»ä¼å¤ãé£ä¹J2EEåºç¨æå¡å¨æåªäº?åæåªäºåè½å¢?ä¸èµ·æ¥ççå§!
ä»åè½å®ç°ä¸ååï¼
æå®ç°å®æ´J2EEè§è(fullprofile)çWeblogic,WebSphere,GlassFish
æå®ç°webåºç¨è§è(webprofile)çTomEE,JBoss/WildFly
æåºæ¬çServletåJspè§èçWeb容å¨(WebContainer)Tomcat,Jetty,Resin
å顾è¿å»çå¹´ï¼ååºç¨æå¡å¨å¸åºå æçåæåç§ã
ä¸å¾ä¸ºå个åºç¨æå¡å¨ä½¿ç¨ç饼å¾
æ们çå°ï¼å¨ä¼å¤J2EEåºç¨æå¡å¨ä¸ï¼Tomcat使ç¨çè¾¾å°.%ï¼ç¨³å第ä¸ã
ç¸è¾å¹´ï¼Tomcat使ç¨çå¤§å¹ å¢é¿ï¼å¢é¿å°è¿%ã
æ´ä½èè¨ï¼Tomcatå为ServletåJspè§èçåèå®ç°(Referenceimplementationï¼ç®ç§°RI)ï¼ä¸è¬é½ä¼å¨ç¬¬ä¸æ¶é´å®ç°è§èçæ°ç¹æ§å¹¶éè¿OracleçCTSæµè¯è®¤è¯ãç®åææ°çTomcat9.0ï¼è½è¿æ¯alphaçï¼ä½å·²ç»å®ç°äºServlet4.0èæ¡ï¼æå ´è¶£çæåï¼å¯ä»¥ä¸è½½å°é²å¦!
Tomcatæ¯ä¸ä¸ªå®ç°äºJAVAEEæ åçæå°çWEBæå¡å¨ï¼æ¯Apache软件åºéä¼çJakarta项ç®ä¸çä¸ä¸ªæ ¸å¿é¡¹ç®ï¼ç±ApacheãSunåå ¶ä»ä¸äºå ¬å¸åä¸ªäººå ±åå¼åèæãå 为Tomcatææ¯å è¿ãæ§è½ç¨³å®ï¼èä¸å¼æºå è´¹ï¼å èæ·±åJavaç±å¥½è çåç±å¹¶å¾å°äºé¨å软件å¼ååç认å¯ï¼æ为ç®åæ¯è¾æµè¡çWebåºç¨æå¡å¨ãå¦ä¹ JavaWebå¼åä¸è¬é½ä½¿ç¨Tomcatæå¡å¨ï¼è¯¥æå¡å¨æ¯æå ¨é¨JSP以åServletè§èï¼å¯å¨çé¢å¦å¾ï¼
Tomcatæ¯ä¸æ¬¾é常ä¼ç§çJavaWebæå¡å¨,以è´äºå¾å¤å¼æºJavaåºç¨æå¡å¨(å¦JOnAS)ç´æ¥éæå®ä½ä¸ºservlet容å¨ã
Tomcatçæ»ä½ç»æ
Tomcatä¸ä¸»è¦æ¶åServer,Service,Engine,Connector,Host,Contextç»ä»¶ï¼ä¹åç¨è¿Tomcatç.ç«¥éæ¯ä¸æ¯è§å¾è¿äºç»ä»¶çå称æç¹ä¼¼æ¾ç¸è¯ç赶èï¼æ²¡èµ¶è?!æ¨åæ³æ³ã好å§ï¼ä¸ç¨ä½ æ³äºï¼ææ¥åè¯ä½ å§ãå ¶å®å¨Tomcatäºè¿å¶ååå 解åå,å¨confç®å½ä¸æä¸ä¸ªserver.xmlæ件ï¼ä½ æå¼å®ç两ç¼ççï¼æ¯ä¸æ¯åç°server.xmlæ件ä¸å·²ç»å å«äºä¸è¿°çå 个å称ã
Tomcaté群æºç çç±»å¾
ä»å¾ä¸æ们å¯ä»¥çåºTomcaté群å æ¬ä»¥ä¸å 个æ¹é¢çå 容:
Session:Sessionå为StandardSessionä¸ClusterSession两ç§,åè ç¨äºSessionå¤å¶ã
SessionManager:æç¨äºé群Session管ççClusterSession,ä¹æç¨äºå¯¹Sessionè¿è¡ä¸è¬æ¥å¸¸ç®¡çç,å¦PersistentManager,BackupManager,SimpleTcpReplicationManagerã
ç»éè¿ æ¡æ¶:SessionManagerè°ç¨ç»é讯æ¡æ¶è¿è¡Sessionçä¼ è¾,Tomcatéç¨çç»é
讯æ¡æ¶æ¯tribe,ç®åtribe已被ç¬ç«ä¸ºå¼æ¾çapacheå·¥ç¨ã
Cluster:æ¹ä¾¿é群管çèæ´¾çåºçé»è¾æ¦å¿µ,å¯å°å®é ç©çæºåå为ä¸ä¸ªCluster,ä¹å¯å°ä¸å°ç©çæºä¸ä¸å端å£çå®ä¾åå为ä¸ä¸ªCluster,å®æä¸ä¸ªç®åçå®ç°ç±»SimpleTcpClusterã
1.1Session
æå¡å¨é群é常æ纵两ç§session:
1.Stickysessions:å°½é让åä¸ä¸ªå®¢æ·è¯·æ±ç±åä¸å°æå¡å¨æ¥å¤ç,è¿æ ·stickysessionså°±æ¯åå¨äºåæºæå¡å¨ä¸æ¥å客æ·ç«¯è¯·æ±çsession,å®ä¸éè¦è¿è¡Sessionå¤å¶,å¦æè¿ä¸ªåæºå¤±è´¥çè¯,ç¨æ·å¿ é¡»éæ°ç»å½ç½ç«ã
2.Replicatedsessions:å¨ä¸å°æå¡å¨ä¸çsessionç¶æ被å¤å¶å°é群çå ¶ä»æå¡å¨ä¸,æ 论ä½æ¶,åªè¦sessionæ¹åäº,sessionæ°æ®é½è¦éæ°å ¨é¨æé¨å(ä¾æ®å¤å¶çç¥)被å¤å¶å°å ¶ä»æå¡å¨ä¸ã
Tomcatæ¯æ以ä¸ä¸ç§sessionæä¹ æ§ç±»å:
1.å åå¤å¶:å¨JVMå åä¸å¤å¶sessionç¶æ,使ç¨Tomcatèªå¸¦çSimpleTcpClusteråSimpleTcpClusterManagerç±»ã
2.æ°æ®åºæä¹ æ§:å¨è¿ç§ç±»åä¸,sessionç¶æä¿åå¨ä¸ä¸ªå ³ç³»æ°æ®åºä¸,æå¡å¨ä½¿ç¨org.apache.catalina.session.JDBCManagerç±»ä»æ°æ®åºä¸è·åSessionä¿¡æ¯ã
3.åºäºæ件çæä¹ æ§:è¿é使ç¨ç±»org.apache.catalina.session.FileManageræsessionç¶æä¿åå°ä¸ä¸ªæ件系ç»ã
SessionManager
Tomcatéè¿org.apache.catalina.Manageræ¥ç®¡çSession,Manageræ¥å£æ»æ¯åContextContainerç¸å ³èãå®ä¸»è¦è´è´£sessionç建ç«ãæ´æ°åéæ¯ã该æ¥å£ä¸ä¸äºéè¦çæ¹æ³æ:
ç¨æ·å¨Servletä¸éè¿javax.servlet..ConnectException:Connectionrefused
atjava.net.PlainSocketImpl.socketConnect(NativeMethod)
atjava.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:)
atjava.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:)
atjava.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:)
atjava.net.SocksSocketImpl.connect(SocksSocketImpl.java:)
atjava.net.Socket.connect(Socket.java:)
atjava.net.Socket.connect(Socket.java:)
atjava.net.Socket.(Socket.java:)
atjava.net.Socket.(Socket.java:)
atorg.apache.catalina.startup.Catalina.stopServer(Catalina.java:)
atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
atjava.lang.reflect.Method.invoke(Method.java:)
atorg.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:)
atorg.apache.catalina.startup.Bootstrap.main(Bootstrap.java:)
å°tomcat9å å ¥å°ç³»ç»æå¡å表ä¸ï¼
è¿å ¥å°/etc/init.dç®å½ä¸ï¼
cd/etc/init.d
å建tomcat9æå¡é ç½®æ件ï¼
vitomcat9
å°å¦ä¸ä»£ç å å ¥åå ¥å°tomcat9é ç½®æ件ä¸ï¼
#idea-tomcatconfigstart---
#!/bin/bash
#description:TomcatStartStopRestart
#processname:tomcat
#chkconfig:
JAVA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4/
exportJAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
exportPATH
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4/
case$1in
start)
sh$CATALINA_HOME/bin/startup.sh
;;
stop)
sh$CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh$CATALINA_HOME/bin/shutdown.sh
sh$CATALINA_HOME/bin/startup.sh
;;
esac
exit0
#chmodtomcat
#chkconfig--addtomcat
#chkconfig--leveltomcaton
#chkconfig--listtomcat
#idea-tomcatconfigend---
é®å ¥Esc并è¾å ¥â:wq!âä¿æ并éåº;
å ¶ä¸ç注æç¹æ¯å°JAVA_HOMEåCATALINA_HOMEåé设置æä¸æ们å½åé ç½®ç¸ä¸è´çè·¯å¾;
为tomcat9åé å¯æ§è¡æéï¼
chmod+xtomcat9
å°tomcat9çº³å ¥å°ç³»ç»çæå¡å表ä¸ï¼å³æ·»å tomcat9为系ç»æå¡ï¼
chkconfig--addtomcat9
æ¥çå½åç³»ç»æå¡é½æåªäºï¼
chkconfig--list
ä¹å¯ä»¥æ¥çæå®çç³»ç»æå¡ï¼å¦è¿éæ们æå®tomcat9è¿ä¸ªæå¡ï¼
chkconfig--listtomcat9
æå°å¦ä¸ä¿¡æ¯ï¼
tomcat:off1:off2:on3:on4:on5:on6:off
å表æå·²å°tomcat9设置为系ç»æå¡ï¼2ã3ã4ã5é½ä¸ºon表示å¯éç³»ç»èªå¨å¯å¨;
æ们å¯ä»¥å¨ä»»æç®å½ä¸æ§è¡å ³éãå¯å¨ãéå¯Tomcat9æå¡å¦ï¼
.1å ³étomcat9æå¡ï¼
servicetomcat9stop
.2å¯å¨tomcat9æå¡ï¼
servicetomcat9start
.3éå¯tomcat9æå¡ï¼
servicetomcat9restart
åè®°ï¼
linuxç³»ç»ä¸ç/etcç®å½è¡¨ç¤ºâ设å¤âï¼æ为ä¸ç¡¬ä»¶è®¾å¤ç¸å ³çä¿¡æ¯;
/etc/init.dç®å½ä¸çæ件表示å½å设å¤çåå§åé 置信æ¯;
å½ä»¤chkconfig表示添å (--add)ãå é¤(--del)ãæ¥ç(--list)ç³»ç»æå¡;
çäºâå¨CentOS7ä¸å®è£ Tomcat9çæ¹æ³æç¨âè¿æ³çï¼
1.CentOS7å®è£ é ç½®å¾ææç¨
2.å¨CentOS7ä¸é ç½®NICç»å®æç¨
3.CentOS7设置ç½ç»èªå¨å¯å¨æç¨
4.Tomcat7.0çå®è£ ä¸é ç½®
5.centos7å¿«éå¯å¨åºç¨ç¨åºæç¨
å¦ä½å¨CentOS7ä¸å®è£ Tomcat91éè¿SecureCRTè¿æ¥å°é¿éäºCentOS7æå¡å¨;
2è¿å ¥å°ç®å½/usr/local/ä¸ï¼
cd/usr/local/
3å建ç®å½/usr/local/toolsï¼å¦ææå忽ç¥ï¼
mkdir-ptools
4å建/usr/local/tomcatç®å½ï¼å¦æå·²åå¨å忽ç¥ï¼
mkdir-ptomcat
5è¿å ¥å°ç®å½/usr/local/toolsä¸ï¼
cdtools/
6ä¸è½½apache-tomcat-9.0.0.M4.tar.gzæ件ï¼
wget
7解å缩apache-tomcat-9.0.0.M4.tar.gzï¼
tar-zxvfapache-tomcat-9.0.0.M4.tar.gz
8å°éè¿è§£åå¾å°çapache-tomcat-9.0.0.M4æ件å¤å¶å°/usr/local/tomcatç®å½ä¸ï¼
mvapache-tomcat-9.0.0.M4../tomcat/
9æå¼æ件/etcç®å½ä¸çprofileæ件ï¼
vim/etc/profile
å°å¦ä¸ä»£ç 追å å°profileæ件æ«å°¾ï¼
#idea-tomcat9configstart---
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4
CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.0.M4
PATH=$PATH:$CATALINA_BASE/bin
exportPATHCATALINA_BASE
#idea-tomcat9configend---
ä¿æ并æ¨åº:wq!
ä¿®æ¹tomcatç端å£å·åå符ç¼ç ï¼
è¿å ¥å°/usr/local/tomcat/apache-tomcat-9.0.0.M4/confç®å½ä¸ï¼
cd../tomcat/apache-tomcat-9.0.0.M4/conf
æå¼tomcatæå¡çé ç½®æ件server.xmlï¼
viserver.xml
æ¾å°å¦ä¸ä»£ç ï¼
å°å ¶ä¸çæ¹æHTTPåè®®çé»è®¤ç«¯å£ï¼æ¹åç代ç å¦ä¸ï¼
å¢å manager-guiå¾å½¢å管ççé¢ç访é®æé(ä¸éè¦çè¯ï¼æ¤æ¥éª¤å¯å¿½ç¥)ï¼
æå¼tomcatçç¨æ·é ç½®æ件tomcat-users.xmlï¼
vitomcat-users.xml
å¨æ ç¾åå å ¥å¦ä¸ä»£ç ï¼
è¿é设置çusernameåpasswordé½æ¯passwordï¼è§è²ä¸ºmanager-gui;
é®å ¥Esc并è¾å ¥â:wq!âä¿æ并éåº;
è¿å ¥å°/usr/local/tomcat/apache-tomcat-9.0.0.M4/binç®å½ä¸ï¼
cd../bin/
æå¼vicatalina.shæ件ï¼
å¨#OSspecificsupport.åé¢å å ¥å¦ä¸ä»£ç ï¼
Servlet源码和Tomcat源码解析
画的不好,请将就。
我一般用的IDEA,很久没用Eclipse了,所以刚开始怎么继承不了HttpServlet类,然后看了一眼我创建的是Maven项目,然后去Maven仓库粘贴了Servlet的妄想山海外挂源码坐标进来。
maven坐标获取,直接百度maven仓库,选择第二个。
然后搜索Servlet选择第二个。
创建一个类,不是接口,继承下HttpServlet。
Servlet接口包括:init()、service()、destroy()和getServletInfo()。其中init()方法负责初始化Servlet对象,容器创建好Servlet对象后会调用此方法进行初始化;service()方法处理客户请求并返回响应,容器接收到客户端要求访问特定的Servlet请求时会调用此方法;destroy()方法负责释放Servlet对象占用的资源;getServletInfo()方法返回一个字符串,包含Servlet的创建者、版本和版权等信息。
ServletConfig接口包含:getServletName()、getServletContext()、getInitParameter(String var1)和getInitParameterNames()。其中getServletName()用于获取Servlet名称,getServletContext()获取Servlet上下文对象,getInitParameter(String var1)获取配置参数,getInitParameterNames()返回所有配置参数的名字集合。
GenericServlet抽象类实现了Servlet接口的同时,也实现了ServletConfig接口和Serializable接口。它提供了一个无参构造方法和一个实现init()方法的构造方法。GenericServlet中的init()方法保存了传递的ServletConfig对象引用,并调用了自身的无参init()方法。它还实现了service()方法,这是Servlet接口中的唯一没有实现的抽象方法,由子类具体实现。
HttpServlet是Servlet的默认实现,它是与具体协议无关的。它继承了GenericServlet,并实现了Servlet接口和ServletConfig接口。HttpServlet提供了一个无参的init()方法、一个无参的destroy()方法、一个实现了getServletConfig()方法的方法、一个返回空字符串的getServletInfo()方法、以及一个实现了service()方法的抽象方法。service()方法的实现交给了子类,以便在基于HTTP协议的Web开发中具体实现。
Tomcat的底层源码解析如下:
Server作为整个Tomcat服务器的代表,包含至少一个Service组件,用于提供特定服务。配置文件中明确展示了如何监听特定端口(如)以启动服务。
Service是逻辑功能层,一个Server可以包含多个Service。Service接收客户端请求,解析请求,完成业务逻辑,然后将处理结果返回给客户端。Service通常提供start方法打开服务Socket连接和监听服务端口,以及stop方法停止服务并释放网络资源。
Connector称为连接器,是Service的核心组件之一。一个Service可以有多个Connector,用于接收客户端请求,将请求封装成Request和Response,然后交给Container进行处理。Connector完成请求处理后,将结果返回给客户端。
Container是Service的另一个核心组件,按照层级有Engine、Host、Context、Wrapper四种。一个Service只有一个Engine,它是整个Servlet引擎,负责执行业务逻辑。Engine下可以包含多个Host,一个Tomcat实例可以配置多个虚拟主机,默认情况下在conf/server.xml配置文件中定义了一个名为Catalina的Engine。Engine包含多个Host的设计使得一个服务器实例可以提供多个域名的服务。
Host代表一个站点,可以称为虚拟主机,一个Host可以配置多个Context。在server.xml文件中的默认配置为appBase=webapps,这意味着webapps目录中的war包将自动解压,autoDeploy=true属性指定对加入到appBase目录的war包进行自动部署。
Context代表一个应用程序,即日常开发中的Web程序或一个WEB-INF目录及其下面的web.xml文件。每个运行的Web应用程序最终以Context的形式存在,每个Context都有一个根路径和请求路径。与Host的区别在于,Context代表一个应用,如默认配置下webapps目录下的每个目录都是一个应用,其中ROOT目录存放主应用,其他目录存放子应用,而整个webapps目录是一个站点。
Tomcat的启动流程遵循标准化流程,入口是BootStrap,按照Lifecycle接口定义进行启动。首先调用init()方法逐级初始化,接着调用start()方法启动服务,同时伴随着生命周期状态变更事件的触发。
启动文件分析Startup.bat:
设置CLASSPATH和MAINCLASS为启动类,并指定ACTION为启动。
Bootstrap作为整个启动时的入口,在main方法中使用bootstrap.init()初始化容器相关类加载器,并创建Catalina实例,然后启动Catalina线程。
Catalina Lifecycle接口提供了一种统一管理对象生命周期的接口,通过Lifecycle、LifecycleListener、LifecycleEvent接口,Catalina实现了对Tomcat各种组件、容器统一的启动和停止方式。在Tomcat服务开启过程中,启动的一系列组件、容器都实现了org.apache.catalina.Lifecycle接口,其中的init()、start()和stop()方法实现了统一的启动和停止管理。
加载方法解析server.xml配置文件,加载Server、Service、Connector、Container、Engine、Host、Context、Wrapper一系列容器,加载完成后调用initialize()开启新的Server实例。
使用Digester类解析server.xml文件,通过demon.start()方法调用Catalina的start方法。Catalina实例执行start方法,包括加载server.xml配置、初始化Server的过程以及开启服务、初始化并开启一系列组件、子容器的过程。
StandardServer实例调用initialize()方法初始化Tomcat容器的一系列组件。在容器初始化时,会调用其子容器的initialize()方法,初始化子容器。初始化顺序为StandardServer、StandardService、StandardEngine、Connector。每个容器在初始化自身相关设置的同时,将子容器初始化。
ubuntu下查看tomcat运行状态
启动:一般是执行sh tomcat/bin/startup.sh 停止:一般是执行sh tomcat/bin/shutdown.sh脚本命令查看:执行ps -ef |grep tomcat 输出如下 *** 。等等.Bootstrap start 说明tomcat已经正常启动, 就为进程号 pid =
杀死:kill -9
------------------------linux下实时查看tomcat运行日志-------------------------
1、先切换到:cd tomcat/logs
2、tail -f catalina.out
3、这样运行时就可以实时查看运行日志了
Ctrl+c 是退出tail命令。