开头说两句

小刀博客: https://www.lixiang.red
小刀公众号: 程序员学习大本营

学习背景

在前两篇中,我们讲述了tomcat的源码结构
https://www.lixiang.red/articles/2019/08/04/1564907616303.html
还有tomcat的server.xml结构.
https://www.lixiang.red/articles/2019/08/06/1565094623138.html
今天我们来继续看tomcat的启动过程

从已知startup.bat/sh入手

windows上启动是:startup.bat
linux/mac上启动是startup.sh

startup.sh

重点在于最后一行:

# PRGDIR 是当前tomcat下的bin目录PRGDIR=`dirname "$PRG"`EXECUTABLE=catalina.sh执行tomcat/bin/catalina.sh start $@ 是代表全部的参数,exec "$PRGDIR"/"$EXECUTABLE" start "$@"

catalina.sh

我们通过参数start进行追踪:

在这里看到了对start参数进行判断,然后走不同的分支逻辑经过一大堆的判断,最后达到可启动的状态时,就开始执行启动的命令:

nohup: 是linux 系统中,可以后台运行程序的命令,窗口关掉也会存在

ENDORSED_PROP: 可以覆盖部分jvm bootstarp类加载器加载的类

org.apache.catalina.startup.Bootstrap: 最后会执行这个类

Bootstrap

根据上文,我们可以找到Bootstrap这个类的main函数

如上图所示,只要执行了以下几步:
1. 初始化bootstrap实例
2. 调用bootstrap的init方法,去初始化类加载器,以及catalina实例
3. 调用bootstrap的start方法,然后通过反射去调用catalina的start 方法

init():

 public void init() throws Exception {        // 初始化类加载器        initClassLoaders();        // 设置当前线程的类加载器为catalinaLoader        // 当前线程:初始化Catalina的线程,初始化Servlet容器的这个线程        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.getConstructor().newInstance();        // Set the shared extensions class loader        if (log.isDebugEnabled()){            log.debug("Setting startup class properties");        }        // 获取到Catalina.setParentClassLoader的方法        String methodName = "setParentClassLoader";        Class> paramTypes[] = new Class[1];        paramTypes[0] = Class.forName("java.lang.ClassLoader");        Object paramValues[] = new Object[1];        paramValues[0] = sharedLoader;        // 通过反射设置 Catalina实例使用的父类加载器为sharedLoader        Method method =            startupInstance.getClass().getMethod(methodName, paramTypes);        method.invoke(startupInstance, paramValues);        catalinaDaemon = startupInstance;    }

start():

public void start()        throws Exception {        if( catalinaDaemon==null ) init();        // 使用反射去调用Catalina 的 start 方法        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);        method.invoke(catalinaDaemon, (Object [])null);    }

最后说两句

这样就完成了tomcat 从命令行到bootstrap以及catalina的初步初始化.后面还有server,service , Engine , host 等组件的加载
在本篇学习中,小伙伴们有什么问题,可以和小刀一起交流: best396975802


标题:tomcat学习|tomcat的启动过程作者:weixiaodexiaoxiaodao地址:https://www.lixiang.red/articles/2019/08/07/1565188609044.html

tomcat启动_tomcat学习|tomcat的启动过程相关推荐

  1. tomcat jar包_tomcat学习|tomcat中的类加载器

    开头说两句 小刀博客: http://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上期我们聊到了tomcat中各个组件在默认值,在其中,我们看到了有关类加载器的代码, 如 ...

  2. tomcat jar包编译后变成文件夹_tomcat学习|tomcat中的类加载器

    开头说两句 小刀博客: https://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上期我们聊到了tomcat中各个组件在默认值,在其中,我们看到了有关类加载器的代码, ...

  3. JavaWeb学习-Tomcat系列-1-安装和启动

    本篇开始正式进入JavaWeb的学习,我们先来学习和了解tomcat的基本知识,然后我们选择J2EE版本的Eclipse并配置Tomcat集成.在学习Tomcat之前,我们来学习一些WEB的概念和周围 ...

  4. detected idea启动 web_IDEA使用Tomcat服务器出现乱码问题排查过程

    IDEA使用Tomcat服务器出现乱码问题排查过程 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 最近刚使用IDEA,在开发一个功能的时候,开始使用Jetty作为容器进 ...

  5. 记一次Tomcat服务部署,启动过滤器异常,问题查找过程

    前言 因工作需要,在搭建新的环境时,需要部署war服务,然后初次选择容器时决定使用tomcat8.5,结果遇到了问题,在同事提醒下使用tomcat9才得以解决,但是不能只解决问题,还需要查询产生原因, ...

  6. tomcat jsvc java_opts_Tomcat 学习笔记(2) - 使用 jsvc 启动tomcat

    jsvc 是个什么是么高端武器呢 全称:Java Service 还是没有弄明白是什么,那就继续往下看. 我们赞不讨论 tomcat 应不应该运行在80端口上. 假如我们有需求,需要 tomcat 运 ...

  7. Docker启动tomcat容器部署java web应用详细过程

    1.由于docker拉取tomcat镜像速度非常慢,可以在网易云镜像中心获取镜像地址 docker pull hub.c.163.com/library/tomcat:latest 下载成功后,查看下 ...

  8. tomcat源码_从源码角度讲Tomcat在SpringBoot 中是如何启动的?

    我们知道 SpringBoot 给我们带来了一个全新的开发体验,我们可以直接把 web 程序达成 jar 包,直接启动,这就得益于 SpringBoot 内置了容器,可以直接启动,本文将以 Tomca ...

  9. class没有发布到tomcat_面试官扎心一问:Tomcat 在 SpringBoot 中是如何启动的?

    作者:木木匠 my.oschina.net/luozhou/blog/3088908 前言 我们知道 SpringBoot 给我们带来了一个全新的开发体验,我们可以直接把 web 程序达成 jar 包 ...

最新文章

  1. IE浏览器中iframe背景BODY透明
  2. C++实现删除字符串中所有重复出现的字符
  3. 脑与神经科学3 脑神经影像上
  4. cmake的使用-为什么要使用CMake
  5. ajax请求web服务返回json格式
  6. 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
  7. python中input和raw_input的区别
  8. java实现人民币数字和大写转换
  9. Backup Exec 在Windows平台下安装、设置及对Oracle数据库备份详细说明
  10. HTML5+CSS编写个人博客界面
  11. Eclipse使用基础教程
  12. 解密深圳IT人士的当前薪情【转自:中国it实验室】
  13. IE11怎么设置默认以IE8的方式解析
  14. 矩阵卷积、矩阵相乘以及频域相乘之间的关系
  15. 生化危机5显示无法连接服务器,《生化危机5》黄金版无法联机怎么办?
  16. picpick快捷键
  17. ALLOCATE语句分配FORTRAN动态数组方法
  18. C#调用映美云打印机CFP535
  19. python实现对视频的打码
  20. Java习题集第八章Java的网络程序设计

热门文章

  1. 多媒体计算机系统是能进行获取,第六章 7 多媒体计算机系统.pdf
  2. php 经纬度 摩卡 转换,WGS84经纬度坐标与WEB摩卡托坐标转换
  3. 去水印--《On the Effectiveness of Visible Watermarks》
  4. 使用sql来拼接语句,最终传入Mybatis中执行
  5. java jms过时了么_JMS Message正在从Hibernate获取过时的数据
  6. python缩进用什么键盘好_关于Python基础缩进和选择的介绍
  7. jdk、jre、jvm有什么区别?
  8. Python测试框架pytest(02)PyCharm设置运行pytest、pytest.main()
  9. Python游戏开发pygame模块,Python实现吃豆人,儿时的回忆
  10. 微型计算机系统结构的五大基本组成部件,连接计算机系统结构的五大基本组成部件...