banner

tomcat笔记-tomcat启动过程及类库加载顺序

应用服务器的请求处理开始于监听的socket端口接收到数据,结束于将服务器处理结果写入socket输出流。

在这个处理过程中,应用服务器需要将需求按照既定协议进行读取,并封装为与具体通讯方案无关的请求对象。然后根据请求映射规则定位到具体的处理单元(在java应用服务器中,多数是某个web应用下的一个servlet)进行处理。当然,如果我们的应用不是基于简单的servletapi,而是基于当前成熟的mvc框架(如apache struts、springmvc),那么在多数情况下请求将进一步匹配到servlet下的一个控制器-这部分已经不属于应用服务器的处理范畴,而是由具体的MVC框架进行匹配。当servlet或者控制器的业务处理结束后,处理结果将被写入一个与通信方案无关的对象。最后,该响应对象将按照既定协议写入输出流。

j2se标准加载器

JVM提供了3个类加载器

booststrap:用于加载JVM提供的基础运行类,即位于%JAVA_HOME%/jre/lib目录下的核心类。

extension:Java提供的一个标准的扩展机制用于加载除核心类库外的jar包,既只要复制到指定的扩展目录(可多个)下的jar,JVM会自动加载(不需要通过——classpath指定)。默认的扩展目录是%JAVA_HOME%/jre/lib/ext。

典型场景:java使用该类加载器加载JVM默认提供的但是不属于核心类库的jar,如JCE等。不推荐将应用程序依赖的类库放置到扩展目录下,因为该目录下的类库对所有基于该JVM运行的应用程序可见。

system用户加载环境变量CLASSPATH(不推荐使用)指定目录下的或者-classpath运行参数指定的jar包。system类加载器通常用于加载应用程序jar包及其他启动入口类(tomcat的bootstrap类既由system类加载器加载)。

应用程序在不自己构造类加载器的情况下,使用system作为默认类的加载器。如果应用程序自己构造类加载器,基本也以system作为父类加载器。

tomcat加载器

应用服务器通常会自行创建类加载器以实现更灵活的控制,每个web应用都由一个而独立的类加载器实现。

隔离性:web应用类库相互隔离,避免依赖库或者应用包相互影响。

灵活性:web应用之间的类加载器相互独立,那么我们就只能只针对一个web应用进行重新部署,此时该web应用的类加载器将会重新创建,而且不会影响其他web应用。如果采用一个类加载器,显然无法实现,因为只有一个类加载器的时候,类之间的依赖是杂乱无章的,无法完整地移除某个web应用的类。

性能:由于每个web应用都由一个类加载器,因此web应用在加载类时,不会搜索其他web应用包含的jar包,性能自然高于应用服务器只有一个类加载器的情况。

tomcat提供的3个基础类和web应用加载器

common:以system为父加载器,位于tomcat应用服务器顶层的功用类加载器。其路径为common.loader,默认指向:$catalina_home/lib下的包。

catalina:以common为父加载器,是用于加载tomcat应用服务器的类加载器,其路径为server.loader,默认为空。此时tomcat使用common类加载器加载应用服务器。

shared:以common为父加载器,是所有web应用的父加载器,其路径为shared.loader,默认为空。此时tomcat使用common类加载器作为web应用的附加载器。

web应用:以shared为父加载器,加载/WEB-INF/classes目录下的未压缩的class和资源文件以及/WEB-INF/lib目录下的jar包。如前所述,该类加载器只对当前web应用可见,对其他web应用均不可见。

tomcat服务器$CATALINA_HOME/bin目录下的包作为启动入口由system类加载器加载。

注:

  

  

共享:tomcat通过common类加载器实现了jar包在应用服务器以及web应用之间共享。通过shared类加载器实现了jar包在web应用之间的共享,通过catalina类加载器加载服务器依赖的类。

web应用类加载器

Java默认加载机制是委派模式,委派过程如下。

1,从缓存中加载。

2,如果缓存中没有,则从父类加载器中加载。

3,如果父类加载器灭有,则从当前类加载器加载。

4,如果没有,则抛出异常。

web应用类加载器默认加载顺序

1,从缓存中加载

2,如果没有,则从JVM的bootstrap类加载器加载。

3,如果没有,则从当前类加载器加载(按照WEB-INF/classes、WEB-INF/lib的顺序)

4,如果没有,则从父类加载器加载,由于父类加载器采用默认的委派模式,所以加载顺序为system、common、shared。

tomcat提供了delegate属性用于控制是否启用java委派模式。模式是false(不启用)。当配置为true时,tomcat将使用java默认的委派模式。

1,从缓存中加载

2,如果没有,从JVM的bootstrap类加载器加载

3,如果没有,则从父类加载器加载(system、common、shared)

4,如果没有,则从当前类加载器加载

注:

  

  

除了通过delegate属相还可以通过packagetriggersdeny属性只让某些包路径采用java的委派模式,web应用类加载器对于符合packagetriggersdeny指定包路径的类强制采用Java的委派模式。

tomcat通过该机制实现为web应用中的jar包覆盖服务器提供包的目的。Java核心类库,servlet规范类库是无法覆盖的,此外,Java默认提供的工具包,由于位于JVM的bootstrap类加载器也无法覆盖,只能通过endorsed的方式实现。

 

推荐阅读:

IT运维工程师学习笔记-Redis笔记(4):redis数据结构-散列/有序集合

腾讯QQ不需要开通vip会员利用onedrive漫游聊天记录

解决安装卡巴斯基安全软件后不能远程访问

阅读: 806
在同意共创许可协议(CC BY-NC-SA-4.0)的前提下,您可以转载本文。
付生保个人博客
https://shengbao.org/719.html

相关阅读

留言评论

暂无留言