文档章节

Tomcat类加载分析

鹜好逑
 鹜好逑
发布于 2017/03/29 16:20
字数 377
阅读 17
收藏 0

Tomcat类加载分析

Bootstrap.java 定义了三个类加载器

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

这三个类加载器分别有什么不同 用在什么地方?

初始化类加载器

private void initClassLoaders() {
        try {
            commonLoader = createClassLoader("common", null);
            if( commonLoader == null ) {
                // no config file, default to this loader - we might be in a 'single' env.
                commonLoader=this.getClass().getClassLoader();
            }
            //调用createClassLoader方法创建类加载器
            catalinaLoader = createClassLoader("server", commonLoader);
            sharedLoader = createClassLoader("shared", commonLoader);
        } catch (Throwable t) {
            log.error("Class loader creation threw exception", t);
            System.exit(1);
        }
    }

方法 private ClassLoader createClassLoader(String name, ClassLoader parent) 代码有将近90多行比较长 核心内容是 根据String name从配置文件加载指定路径的class和jar

从cataina.properties文件下找到三个配置项


common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
server.loader=
shared.loader=

common属于Tomcat自身类加载器, common.loader配置了Common加载器要加载的jar包和class文件路径

server.loader和shared.loader为空,跟commonLoader加载器加载内容是一样的

Bootstrap.java init()方法

public void init()
        throws Exception
    {

        // Set Catalina path
    	//设置Tomcat工作目录
        setCatalinaHome();
        setCatalinaBase();

        //初始化类加载器 
        initClassLoaders();

        //catalinaLoader加载器
        Thread.currentThread().setContextClassLoader(catalinaLoader);

        SecurityClassLoad.securityClassLoad(catalinaLoader);

        // Load our startup class and call its process() method
        if (log.isDebugEnabled())
            log.debug("Loading startup class");
        //通过反射实例化Catalina对象 供后续启动调用
        Class startupClass =
            catalinaLoader.loadClass
            ("org.apache.catalina.startup.Catalina");
        Object startupInstance = startupClass.newInstance();

        // Set the shared extensions class loader
        //设置类加载器
        if (log.isDebugEnabled())
            log.debug("Setting startup class properties");
        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);
            
        //Catalina.java运行时使用的是sharedLoader加载器    
        method.invoke(startupInstance, paramValues);

        
        catalinaDaemon = startupInstance;

    }

© 著作权归作者所有

共有 人打赏支持
鹜好逑
粉丝 0
博文 8
码字总数 2611
作品 0
杭州
私信 提问
Tomcat7.0源码分析——类加载体系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/50995516 前言Tomcat遵循J2EE规范,实现了Web容器。很多有关web的书籍和文章都离不...

泰山不老生
2016/03/28
0
0
【死磕 Tomcat】—类加载器

原文作者:黄晓峰 原文链接:https://blog.csdn.net/dwademia/article/details/80140585 在分析 tomcat 类加载之前,我们简单的回顾下 java 体系的类加载器 启动类加载器(Bootstrap ClassLo...

黄晓峰
2018/09/08
0
0
Tomcat 源码分析(-)启动过程分析

前面几篇文章分别介绍了Tomcat的安装、优化和框架,本文主要用于分析Tomcat源码启动过程,研究一个框架最好的着手方式可能就是研究它的启动过程,因为在这过程中我们可以看到它内部的层次关系...

AaronSheng
2016/11/28
29
0
【死磕 Tomcat】—关于tomcat热加载的一些思考

原文作者:黄晓峰 原文链接:https://blog.csdn.net/dwademia/article/details/80512916 在前面的文章中,我们分析了 tomcat 类加载器的相关源码,也了解了 tomcat 支持类的热加载,意味着 ...

黄晓峰
2018/09/08
0
0
【死磕 Tomcat】—启动分析(四) webapp

原文作者:黄晓峰 原文链接:https://blog.csdn.net/dwademia/article/details/79328151 上一篇文章中我们分析了 Service、Engine、Host、Pipeline、Valve 组件的启动逻辑,在 HostConfig 中...

黄晓峰
2018/09/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何有效的背单词

转眼间到了大三快要结束了。英语四级考了三次了,每次都220多分。成绩很稳定,但离四级线还有200多分。学校规定如果过不了四级线,就拿不到学士学位证。没有学位证就找不到好工作,找不到好工...

我是菜鸟我骄傲
12分钟前
0
0
导出表格

https://blog.csdn.net/hhzzcc_/article/details/80419396

Js_Mei
36分钟前
0
0
Ubuntu中安装Elasticsearch

1.安装jre elasticsearch是使用java开发的搜索引擎,因此其运行依赖于java runtime environment,我们在这里不使用Oracel的官方jre,改为使用open-jre。 运行环境: ubuntu:18.04 jre:openj...

cloes
53分钟前
0
0
nginx rails 详细站点配置入门教程

Ruby on Rails 是一个用于开发数据库驱动的网络应用程序的完整框架。Rails基于MVC(模型- 视图- 控制器)设计模式。从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的模型,R...

xiangyunyan
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部