`

Classloader委任机制以及Tomcat中Classloader分析(整理)

阅读更多

参照网页

http://hi.baidu.com/qmiao128/item/c983bffca5ca6fec1b111f26

http://m.oschina.net/blog/144133

http://blog.csdn.net/feng2007110221053/article/details/7071823


Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。

 

这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader

和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。

其中AppClassLoader在很多地方被叫做System ClassLoader

 

(1).BootStrap ClassLoader:启动类加载器,由C++代码实现,负责加载存放在%JAVA_HOME%\lib目录中的,或者通被-Xbootclasspath参数所指定的路径中的,并且被java虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库,即使放在指定路径中也不会被加载)类库到虚拟机的内存中,启动类加载器无法被java程序直接引用。

 

(2).Extension ClassLoader:扩展类加载器,由sun.misc.Launcher$ExtClassLoader实现,负责加载%JAVA_HOME%\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

 

(3).Application ClassLoader:应用程序类加载器,由sun.misc.Launcher$AppClassLoader实现,负责加载用户类路径classpath上所指定的类库,是类加载器ClassLoader中的getSystemClassLoader()方法的返回值,开发者可以直接使用应用程序类加载器,如果程序中没有自定义过类加载器,该加载器就是程序中默认的类加载器。

 

(4).URLClassLoader用来加载网络上远程的类,暂且不讨论。

 

它们之间的关系:

1.Parent-Child,按顺序从大到小。不是简单的继承关系。

 

2.ClassLoader有个getParent的方法,但是Ext ClassLoader调用后得到的是null,bootstrap是JVM自己的,用户看不到。

 

3.classloader的委托机制:当等级比较低的ClassLoader要加载某个类的时候,它首先会请求Parent加载器来加载,Parent再请求它的Parent。

比如现在Ext要加载了,它往上请求。如果最大的Bootstrap找不到,那么Boot会叫Ext自己找找,Ext找不到,是不会让下一级的App去找的,此时就报出ClassNotFoundException

 

但是现实生活中有很多应用,比如JDBC核心方法在核心库,而驱动在扩展库,是必定在两个地方的,那怎么办呢?

要用到Context ClassLoader:我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。

 

利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。

 

这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的。

class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现)。

 

Tomcat5中类加载器分析

tomcat5中通过自定义一组类加载器,解决了以下几个问题:

(1)部署在一个服务器上的两个Web应用程序自身所使用的Java类库是相互隔离的。

(2)部署在一个服务器上的两个Web应用程序可以共享服务器提供的java共用类库。

(3)服务器尽可能的保证自身安全不受部署的Web应用程序影响。

(4)支持对JSP的HotSwap功能。

 

tomcat5的目录结构

tomcat5主要根据根据java类库的共享范围,分为4组目录:

(1)common目录:能被Tomcat和所有Web应用程序共享。

(2)server目录:仅能被Tomcat使用,其他Web应用程序不可见。

(3)Shared目录:可以被所有Web应用程序共享,对Tomcat不可见。

(4)WEB-INF目录:只能被当前Web应用程序使用,对其他web应用程序不可见。

 

tomcat5自定义类加载器

 

 

这几个类加载器分别对应加载/common/*、/server/*、/shared/*和 /WEB-INF/*类库, 其中Webapp类加载器和Jsp类加载器会存在多个,每个Web应用对应一个Webapp类加载器。

 

CommonClassLoader加载的类可以被CatalinaClassLoader和ShareClassLoader使用;

CatalinaClassLoader加载的类和ShareClassLoader加载的类相互隔离;

WebappClassLoader可以使用ShareClassLoader加载的类,但各个WebappClassLoader间相互隔离;JspClassLoader仅能用JSP文件编译的class文件。

 

Tomcat5动时classloader载顺

Tomcat的class加载的优先顺序一览

1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。

2.环境变量CLASSPATH中的jar和class文件。

3.$CATALINA_HOME/common/classes下的class文件。

4.$CATALINA_HOME/commons/endorsed下的jar文件。

5.$CATALINA_HOME/commons/i18n下的jar文件。

6.$CATALINA_HOME/common/lib 下的jar文件。

(JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)

7.$CATALINA_HOME/server/classes下的class文件。

8.$CATALINA_HOME/server/lib/下的jar文件。

9.$CATALINA_BASE/shared/classes 下的class文件。

10.$CATALINA_BASE/shared/lib下的jar文件。

11.各自具体的webapp /WEB-INF/classes下的class文件。

12.各自具体的webapp /WEB-INF/lib下的jar文件。

 

关于WEB-INF/classes和WEB-INF/lib的load优先顺序,weblogic中,可以通过修正WebContent\WEB-INF\weblogic.xml中的如下参数来设定。

<!-- web-inf/classes里面优于lib加载 -->
<prefer-web-inf-classes>true</prefer-web-inf-classes>

 

最后,思考两个问题:

1.当某个properties文件同时存在于/shared/*类库下的jarWEB-INF/classes中时,会优先load哪一个呢?

  答案是放在/shared/*类库下的jar中的那个。

2.当某个properties文件同时存在于WEB-INF/classesWEB-INF/libjar文件中时,会优先load哪一个呢?

  答案是放在WEB-INF/classes中的那个。

  • 大小: 22.9 KB
分享到:
评论

相关推荐

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    深入理解ClassLoader工作机制.docx

    了解ClassLoader的工作机制对于优化程序性能、处理类冲突以及实现安全的插件系统至关重要。开发者可以根据需求定制ClassLoader,以满足特定的加载需求,如加载动态生成的类或处理版本兼容问题。总的来说,深入理解...

    Tomcat 5.0.18 ClassLoader source code insight

    在实际开发中,理解Tomcat的ClassLoader机制有助于我们解决一些常见的问题,如类加载异常、类版本冲突等。例如,当我们需要自定义类加载顺序时,可以通过修改`catalina.properties`文件中的`common.loader`、`server...

    Tomcat研究之ClassLoader.pdf

    ### Tomcat中的ClassLoader详解 #### 一、引言 在深入了解Tomcat的工作原理时,一个重要的组成部分就是其ClassLoader机制。本文旨在深入剖析Tomcat中特有的类加载器(ClassLoader)体系结构,帮助读者理解Tomcat...

    ClassLoader类加载机制和原理详解

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...

    【图解版】深入分析ClassLoader类加载工作机制

    【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!

    tomcat 学习与分析总结资料

    《Tomcat学习与分析总结资料》是一份涵盖了Tomcat服务器核心知识的综合资源,适合对Java Web应用服务器感兴趣的开发者深入学习。Tomcat是Apache软件基金会的项目,是世界上最流行的开源Servlet容器,它实现了Java ...

    ClassLoader

    ### Java虚拟机中ClassLoader概述与双亲委托机制详解 #### 一、ClassLoader概念与作用 在Java编程语言中,`ClassLoader`是一个非常重要的组件,它负责加载程序运行所需的类文件到Java虚拟机(JVM)中。`ClassLoader`...

    Tomcat加载顺序

    System ClassLoader通常被称为应用程序类加载器,它会从`CLASSPATH`环境变量指定的路径加载类库,以及`$CATALINA_HOME/common/classes`、`$CATALINA_HOME/common/lib`下的类和jar包。这里的类库可以被所有web应用...

    classloader

    ClassLoader就是执行这个动态加载任务的机制。 Java ClassLoader的工作流程大致如下: 1. 当程序需要加载一个类时,它会请求ClassLoader。 2. ClassLoader接收到请求后,首先检查该类是否已经加载过,如果已加载则...

    JVM ClassLoader简析

    在Java世界中,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。ClassLoader是JVM中的一...阅读"ClassLoader简析.pdf"文档和分析"Sample.zip"中的代码,将有助于形成更全面的了解。

Global site tag (gtag.js) - Google Analytics