@IT·互联网代码改变世界

Tomcat 类加载机制简介

2016-09-28  本文已影响721人  Skymiles

1. Web服务器的需求:

1)两个web服务相互隔离(java类库隔离)

2)两个web服务有些类库要共享,但是不能放多份相同的类库,会造成方法区堆积。

3)web服务器要不受web服务影响

2)JSP应用需要HotSwap功能

    所以单独一个classpath无法满足web服务器需求,所以web服务器提供了好几个classpath路径供用户存放第三方类库。不同路径的的类库具有不同访问范围和服务对象。---通常,每个目录会有一个自定义类加载器去加载放置里面的Java类库。

2. Tomcat类加载

Tomcat的类加载顺序(开启了delegate模式)

当tomcat启动时,会创建几种类加载器:

1 Bootstrap 引导类加载器 + Extension类加载器

    先尝试在Bootstrap(位于jre/lib/rt.jar下)和Extension(位于jre/lib/ext下)中进行类型加载。

2 System 系统类加载器(仅仅tomcat使用)

    加载tomcat启动的类,比如CATALINA_HOME/bin/bootstrap.jar,通常在catalina.sh中指定。位于CATALINA_HOME/bin下。

3 Common 通用类加载器(tomcat,web程序都可以使用)

    加载tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar

4 webapp 应用类加载器(仅仅web程序都可以使用)

    每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于WEB-INF/lib下的jar文件中的class和WEB-INF/classes下的class文件。

Tomcat 类加载顺序

    1 使用bootstrap引导类加载器加载(e.g. JRE中的Java基础包)

    2 使用system系统类加载器加载 (e.g. CATALINA_HOME/bin/bootstrap.jar)

    3 使用应用类加载器在WEB-INF/classes中加载

    4 使用应用类加载器在WEB-INF/lib中加载 

    5 使用common类加载器在CATALINA_HOME/lib中加载

    (e.g. CATALINA_HOME/lib/下的)

  如果想要在Web应用间共享一些Jar包,则不仅需要将公共包放在Tomcat的lib下,还要删掉Web应用lib中的包,否则Tomcat启动时还是会优先加载Web应用lib下的包的。

上一篇下一篇

猜你喜欢

热点阅读