`
idealab
  • 浏览: 197755 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Tomcat类加载器体系结构

    博客分类:
  • Java
阅读更多
   与Java语言相似,Tomcat提供了分级类加载机制,当然,最顶端非BootStrap Loader莫属,它由C++编写,JVM启动且完成初始化后首先被调用。不过在Tomcat中类加载体系中,缺少了ExtClassLoader的身影(待验证),ExtClassLoader加载sun公司提供的扩展机制(参考文章:<<Extension Mechanism Architecture>>)。下面是架构图:


上图展示了各层类加载器以及类文件搜索路径,Tomcat为每个部署到其中的Web项目定义一个类加载器(如上图中WebappAClassLoader、WebappBClassLoader),其类文件搜索路径即为%CATALINA_HOME%\webapps\项目名称\WEB-INF\lib\;
%CATALINA_HOME%\webapps\项目名称\WEB-INF\classes\。Tomcat自己定义了一个BootStrap类,在org.apache.catalina.startup.BootStrap定义,其作用是:
1、定义公共类加载器
    private Object catalinaDaemon = null;//定义catalina服务器守护程序实例

    protected ClassLoader commonLoader = null;
    protected ClassLoader catalinaLoader = null;
    protected ClassLoader sharedLoader = null;

    private void initClassLoaders() {
        try {
            ClassLoaderFactory.setDebug(debug);
            commonLoader = createClassLoader("common", null);
            catalinaLoader = createClassLoader("server", commonLoader);
            sharedLoader = createClassLoader("shared", commonLoader);
        } catch (Throwable t) {
            log("Class loader creation threw exception", t);
            System.exit(1);
        }
    }

我们看到commonLoader的父类加载器为null,即在委派机制下它将把类加载任务直接委派给JVM所使用的BootStrap Loader,但为什么是null呢?因为JVM所使用的BootStrap Loader是用C++编写的。
catalinaDaemon为服务器从启动至停止都存在的守护线程。createClassLoader函数利用ClassLoaderFactory类在工厂模式下创建,创建代码如下:
 public static ClassLoader createClassLoader(File unpacked[],File packed[], URL urls[], ClassLoader parent)throws Exception {
...
        //获得将要创建的类加载器的类文件搜索路径
        String array[] = (String[]) list.toArray(new String[list.size()]);
        StandardClassLoader classLoader = null;
        if (parent == null)//父加载器为JVM使用的BootStrap Loader
            classLoader = new StandardClassLoader(array);
        else
            classLoader = new StandardClassLoader(array, parent);
        classLoader.setDelegate(true);//设置该类加载器遵循委派模式
        return (classLoader);
}

Tomcat提供两种类加载器供使用,一种是如上代码中所述的标准类加载器StandardClassLoader,用以实例化为commonLoader、catalinaLoader和sharedLoader,在org.apache.catalina.loader.StandardClassLoader定义,它不提供热部署功能;另外一种是专为Web程序所提供的WebClassLoader,它用以实例化为各部署项目的类加载器,在org.apache.catalina.loader.WebappClassLoader定义,提供热部署功能,也就是在发生ClassLoader搜索路径下的资源改变的动作之后,服务器自动重新加载之。
2、初始化catalina守护程序:
    public void init()
        throws Exception
    {
        // Set Catalina path
        setCatalinaHome();
        setCatalinaBase();
        
        initClassLoaders();
        Thread.currentThread().setContextClassLoader(catalinaLoader);
        SecurityClassLoad.securityClassLoad(catalinaLoader);

        /*利用类加载器catalinaClassLoader加载Catalina,并调用后者的process方法,该方法设置%CATALINA_HOME%,%CATALINA_BASE%,并根据参数配置启动catalina*/
        Class startupClass =
            catalinaLoader.loadClass
            ("org.apache.catalina.startup.Catalina");
        Object startupInstance = startupClass.newInstance();
        
        /*将SharedClassLoader设为Catalina类的ClassLoader*/
        String methodName = "setParentClassLoader";
        Class paramTypes[] = new Class[1];
        paramTypes[0] = Class.forName("java.lang.ClassLoader");
        Object paramValues[] = new Object[1];
        paramValues[0] = sharedLoader;
        Method method =
            startupInstance.getClass().getMethod(methodName, paramTypes);
            
        method.invoke(startupInstance, paramValues);
        catalinaDaemon = startupInstance;
    }

本段代码实现了利用CatalinaClassLoader加载Catalina类,并创建其实例。但很有意思的是,创建实例之后Catalina的类加载器却被设置为SharedClassLoader。
我们知道Catalina是Tomcat容器的代言人,也就是一个在容器生命周期内都存在的类,我们所设计的Servlet是被放置在这个容器里面供调用的,从代码层来讲也就是被实例化,然后引用。同时,在Java类加载器体系结构中定义到:被引用类默认由依赖类的ClassLoader加载,而这样设计的原因是,运行时相同层次的ClassLoader所加载的类无法看到其他ClassLoader所加载的类,可这又是为什么呢?这是Java语言的安全特性所要求的(进一步探讨,请参阅《深入Java虚拟机》)。由上所述,可以知道如果要引用Servlet的话,得有Catalina的ClassLoader出马去加载,但是我们之前已经看到了,每一个Web项目都有一个特定的WebappClassLoder加载,并且Catalina需要引用的可是同时部署到其中的许多个Web项目的Servlet,这就出现了矛盾。但是,我们仔细看看WebappClassLoader的设计,它的父加载器可是SharedClassLoader哦(SharedClassLoader加载的是部署到容器中的多个Web项目共用的资源),故聪明的小花猫把Catalina的类加载器设置为了SharedClassLoader,这样利用父加载器加载Catalina,而子加载器来加载Servlet,岂不是一个绝妙的设计!
注意:代码中利用到了强大的反射机制。

延伸探究:
http://blog.chinaunix.net/u2/83532/showart_1418390.html
http://blog.163.com/haizai219@126/blog/static/44412555200810111429791/
  • 大小: 20.1 KB
7
0
分享到:
评论

相关推荐

    深入探讨 Java 类加载器

    Java 类加载器体系是一个树状结构,主要由以下几部分组成: - **引导类加载器(Bootstrap ClassLoader)**:加载JRE的核心类库,如rt.jar。 - **扩展类加载器(Extension ClassLoader)**:加载JRE的扩展库,位于jre...

    Tomcat研究之ClassLoader.pdf

    本文旨在深入剖析Tomcat中特有的类加载器(ClassLoader)体系结构,帮助读者理解Tomcat如何管理和加载不同类型的类库。 #### 二、Tomcat的ClassLoader体系结构 Tomcat采用了独特的类加载机制来处理不同的类库加载...

    tomcat概述和体系架构

    Tomcat是Apache Jakarta项目的...在开发和运行Web应用时,了解Tomcat的体系结构和工作原理是十分必要的,因为这有助于开发者优化配置和提升应用的性能。随着Web应用的日益复杂,掌握Tomcat的深入知识也越来越受到重视。

    how tomcat works中英文版

    Tomcat的容器体系结构包括多个层次,如Engine(引擎)、Host(主机)、Context(上下文)和Wrapper(Servlet包装器)。每个层次都负责管理一部分Web应用的生命周期,理解这些容器的关系对于配置多应用或多域名环境至...

    apache-tomcat-7.0.59-x64.rar

    在本文中,我们将深入探讨与"apache-tomcat-7.0.59-x64.rar"相关的知识,包括Tomcat的版本、体系结构、安装与配置、管理及性能优化。 首先,"apache-tomcat-7.0.59"是Apache Tomcat服务器的一个特定版本,发布于...

    tomcat9源码的eclipse工程

    9. **类加载器**:Tomcat如何管理不同的类加载器,确保正确隔离不同应用的类。 10. **错误处理和日志系统**:Tomcat的错误页面生成和日志记录机制。 通过以上内容,开发者不仅能提升对Tomcat的理解,还能进一步提高...

    Tomcat8.0底层源码

    Tomcat的容器体系结构是其设计的核心,包括`ContainerBase`、`Host`、`Context`、`Wrapper`等。每个容器都有自己的生命周期,可以包含其他容器,形成了一个树状结构。 七、会话管理 Tomcat支持多种会话管理策略,如...

    HowTomcatWork源码

    Tomcat有自己的类加载器体系,每个Web应用都有独立的类加载器,确保了应用之间的隔离性。源码分析有助于理解类加载器如何查找和加载类,以及如何避免类冲突问题。 5. **部署与上下文** Tomcat处理Web应用的部署,...

    Tomcat源码研究.pdf

    这些问题可能包括端口被占用、配置文件错误、类加载器相关问题等。通过对这些问题的分析,我们可以更加深入地理解Tomcat的工作机制,以及其在不同环境下可能遇到的问题和解决方案。 3. 架构探讨:Tomcat拥有清晰的...

    tomcat+jsp内幕详解

    总结,"Tomcat+jsp内幕详解"涵盖了Tomcat的安装、运行、启动分析、体系结构以及JSP的原理、语法和应用。这些知识是开发和管理基于Java的Web应用程序所必需的,对于理解Web服务的运作机制和提升开发效率有着重要作用...

    1.JVM与Java体系结构

    JVM采用双亲委派模型进行类加载,当加载类时,会先查找父加载器,如果父加载器无法加载,则由当前加载器尝试加载。这种机制保证了类的唯一性,避免了类的冲突。 1.5 调优与问题排查 理解JVM的工作原理对于Java...

    完整版32位tomcat

    这个文件名揭示了Tomcat的版本和体系结构信息。"tomcat-6.0.43"指的是Tomcat的6.0版本,第43次小更新。Tomcat 6.0是在2007年发布的,支持Servlet 2.5和JSP 2.1规范。而"x86"则表明这是为32位(x86架构)处理器设计的...

    jvm基础学习,介绍各种jvm里面的知识点,和深入理解java虚拟机很像,易懂

    类加载过程中采用的双亲委派模型是一种层次结构的类加载器体系结构,它的工作方式如下: 1. 当一个类加载器收到加载类的请求时,它首先尝试让其父类加载器加载该类;如果父类加载器不存在或无法加载,则自行尝试...

    Tomcat体系结构与插件配置教程图解

    二、tomcat服务器体系结构  1.Server整个Servlet容器组合,可以包含一个或多个  2.service:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求。  3.Connector:客户端与...

    apache-tomcat-10.0.12.tar.gz

    4. **Linux x64系统**:x64指的是基于64位AMD或Intel处理器的计算机体系结构。这个版本的Tomcat是为64位Linux系统编译的,这意味着它能充分利用64位系统的内存管理和计算能力。 5. **安装与配置**:在Linux x64环境...

    Tomcat.6.Developer's.Guide

    - **Tomcat 的架构**:详细讲解了Tomcat的体系结构,包括它的核心组件和服务如何协作以支持Web应用程序的运行。 - **Servlet 2.5 规范的实现**:深入探讨了Servlet 2.5规范的关键特性和Tomcat是如何实现这些特性的,...

    tomcat开发技术

    Tomcat的容器体系结构分为四个层次: - **Engine**:最顶层容器,代表整个Tomcat实例。 - **Host**:代表虚拟主机,可承载多个Web应用。 - **Context**:代表一个Web应用,是Web应用的容器。 - **Wrapper**:代表一...

    tomcat6、7、8、9, maven3.5

    Apache Tomcat 3.3是Apache Tomcat 3.x体系结构的最新延续; 它比3.2.4更先进,这是“老”的生产质量释放。 版本3.2.4是“旧的”生产质量版本,现在仅在维护模式。 版本3.1.1是旧版本。 所有的Apache Tomcat 3.X版本...

    tomcat深入剖析.pdf

    #### 一、Tomcat概述与体系结构 - **Tomcat简介**: - Tomcat是一款免费、开源且流行的Servlet容器,主要用于执行Java Servlet和JavaServer Pages(JSP)应用程序。 - 该容器以其简单易用、高性能及可扩展性而受...

    tomcat安全设置学习笔记

    开启后,所有应用程序在执行特定敏感操作时都需要明确的权限,如创建自定义类加载器或打开套接字连接。 权限的授予是通过策略文件来实现的,策略文件定义了哪些应用程序可以执行哪些操作。一个简单的策略文件示例...

Global site tag (gtag.js) - Google Analytics