编译tomcat源码
Ⅰ Tomcat源码解析-组件之StandardServer
StandardServer是tomcat容器的最高层的组件,职责如下:
实现Tomcat一键启动关闭,管理全局 JDNI资源,管理子组件,阻塞tomcat主线程。
StandardServer子组件
Bootstarp作为tomcat启动类,JVM会调用main函数完成tomcat启动。在其内部流程如下:
核心方法功能
Tomcat使用Digester解析server.xml,Digester是一款用于将xml转换为Java对象的事件驱动型工具,是对SAX的高层次的封装。相对于SAX可以为xml中每一个标签设置对应的解析规则。详见 Tomcat相关技术-Digester(二)
这里通过解析server.xml实例化StandardServer,并设置server.xml文件中定义的属性初始化。
server.xml配置
<Server>标签用来表示当前StandardServer组件
StandardServer构造函数
将<server>标签属性映射到StandardServer对象属性中
<GlobalNamingResources>标签中定义了全局JNDI资源,
<Listener>标签中定义StandardServer组件中需要的LifecycleListener监听器。<Server>标签内可以设置多个<Listener>。
Server中定义的Listener
添加LifecycleListener监听器
<Service>标签中定义StandardServer组件中子组件Service。<Server>标签内可以设置多个<Service>。
添加Service子组件
StandardServer作为tomcat最上层的组件,和其他所有组件一样都实现了Lifecycle 接口。
Tomcat 定义一个基类LifecycleBase 来实现 Lifecycle 接口,把一些公共的逻辑放到基类中去,比如生命状态的转变与维护、生命事件的触发以及监听器的添加和删除等,而子类就负责实现自己的初始化、启动和停止等模板方法。为了避免跟基类中的方法同名,我们把具体子类的实现方法改个名字,在后面加上 Internal,叫 initInternal、startInternal 等。
其他模板方法
详见 Tomcat架构设计-组件生命周期
StandardServer组件初始化的核心是调用所有Service子组件初始化方法init。
详细流程如下:
启动start的核心是调用所有Service子组件初始化方法start。
详细流程如下:
启动stop的核心是调用所有Service子组件初始化方法stop。
详细流程如下:
销毁destroy的核心是调用所有Service子组件初始化方法destroy。
1 调用所有Service子组件启动方法destroy
2 销毁JND全局资源
3 jmx bean注销MBeanFactory
4 jmx bean注销StringCache
5 调用LifecycleMBeanBase.destroyInternal 将当前组件对象从jmx 注销
在这样的设计中,在父组件的 init 方法里需要创建子组件并调用子组件的 init 方法。同样,在父组件的 start 方法里也需要调用子组件的 start 方法。只要调用最顶层组件StandardServer的 init 和 start 方法,整个 Tomcat 就被启动起来了。只要调用最顶层组件StandardServer的 destroy 和 stop 方法,整个 Tomcat 就被关闭。
添加已在解析server.xml初始化设置调用
阻塞tomcat主线程,只要stopAwait不为true, tomcat主线程在此无限循环.监听到客户端发起SHUTDOWN命令后退出
Ⅱ 如何将tomcat7.0源码导入eclipse
1.Tomcat源码下载
这个里下载tomcat-6.0.33源码。
2.ant安装,用于编译tomcat的源码。
ant下载解压后将其bin添加到系统环境path中。
3.IDE——选用Eclipse3.7。
Ⅲ 怎么将tomcat源码导入eclipse
1. 去apache官网下载对应的tomcat版本源码(我这里下载的是9.0.0.M9) http://tomcat.apache.org/download-90.cgi
2. 解压后的源码是没法作为工程直接导入eclipse的。需要使用ant进行编译,所以这里需要去ant官网下载ant对应版本。http://ant.apache.org/bindownload.cgi
Ⅳ tomcat的classloader的源码解析
相关源码如下:
common,catalina,shared三个classloader没有违背双亲加载原则
WebappClassLoader违背了双亲委派机制 因为重写了loadclass
在context启动的时候其会启动一个webappLoader
而webappLoader会创建一个WebappClassLoader,设置一个source(对应咱们webapps下面的一个项目)
设置delegate=false 代表不需要遵循双亲委派机制,然后启动WebappClassLoader,
然后这个context的加载的会使用自己的context里面含有的WebappClassLoader去加载bean
当webapps下面有多个项目就建立多个standardContext
每个standardContext 设有一个对应的webappLoader和webappClassLoader
Ⅳ tomcat怎么编译jsp文件
一、jsp执行过程图解
用户访问jsp页面时,jsp的处理过程如下图所示:
从图中可以看出,Tomcat的核心组建是connector和container,container就是容器。容器就是负责管理控制servlet的应用程序。图中的jasper就是解析jsp的jsp引擎。Tomcat既是servlet容器又是web服务器,也是jsp引擎。
