tomcat启动_tomcat学习|tomcat的启动过程
开头说两句
小刀博客: 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的启动过程相关推荐
- tomcat jar包_tomcat学习|tomcat中的类加载器
开头说两句 小刀博客: http://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上期我们聊到了tomcat中各个组件在默认值,在其中,我们看到了有关类加载器的代码, 如 ...
- tomcat jar包编译后变成文件夹_tomcat学习|tomcat中的类加载器
开头说两句 小刀博客: https://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上期我们聊到了tomcat中各个组件在默认值,在其中,我们看到了有关类加载器的代码, ...
- JavaWeb学习-Tomcat系列-1-安装和启动
本篇开始正式进入JavaWeb的学习,我们先来学习和了解tomcat的基本知识,然后我们选择J2EE版本的Eclipse并配置Tomcat集成.在学习Tomcat之前,我们来学习一些WEB的概念和周围 ...
- detected idea启动 web_IDEA使用Tomcat服务器出现乱码问题排查过程
IDEA使用Tomcat服务器出现乱码问题排查过程 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 最近刚使用IDEA,在开发一个功能的时候,开始使用Jetty作为容器进 ...
- 记一次Tomcat服务部署,启动过滤器异常,问题查找过程
前言 因工作需要,在搭建新的环境时,需要部署war服务,然后初次选择容器时决定使用tomcat8.5,结果遇到了问题,在同事提醒下使用tomcat9才得以解决,但是不能只解决问题,还需要查询产生原因, ...
- tomcat jsvc java_opts_Tomcat 学习笔记(2) - 使用 jsvc 启动tomcat
jsvc 是个什么是么高端武器呢 全称:Java Service 还是没有弄明白是什么,那就继续往下看. 我们赞不讨论 tomcat 应不应该运行在80端口上. 假如我们有需求,需要 tomcat 运 ...
- Docker启动tomcat容器部署java web应用详细过程
1.由于docker拉取tomcat镜像速度非常慢,可以在网易云镜像中心获取镜像地址 docker pull hub.c.163.com/library/tomcat:latest 下载成功后,查看下 ...
- tomcat源码_从源码角度讲Tomcat在SpringBoot 中是如何启动的?
我们知道 SpringBoot 给我们带来了一个全新的开发体验,我们可以直接把 web 程序达成 jar 包,直接启动,这就得益于 SpringBoot 内置了容器,可以直接启动,本文将以 Tomca ...
- class没有发布到tomcat_面试官扎心一问:Tomcat 在 SpringBoot 中是如何启动的?
作者:木木匠 my.oschina.net/luozhou/blog/3088908 前言 我们知道 SpringBoot 给我们带来了一个全新的开发体验,我们可以直接把 web 程序达成 jar 包 ...
最新文章
- IE浏览器中iframe背景BODY透明
- C++实现删除字符串中所有重复出现的字符
- 脑与神经科学3 脑神经影像上
- cmake的使用-为什么要使用CMake
- ajax请求web服务返回json格式
- 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
- python中input和raw_input的区别
- java实现人民币数字和大写转换
- Backup Exec 在Windows平台下安装、设置及对Oracle数据库备份详细说明
- HTML5+CSS编写个人博客界面
- Eclipse使用基础教程
- 解密深圳IT人士的当前薪情【转自:中国it实验室】
- IE11怎么设置默认以IE8的方式解析
- 矩阵卷积、矩阵相乘以及频域相乘之间的关系
- 生化危机5显示无法连接服务器,《生化危机5》黄金版无法联机怎么办?
- picpick快捷键
- ALLOCATE语句分配FORTRAN动态数组方法
- C#调用映美云打印机CFP535
- python实现对视频的打码
- Java习题集第八章Java的网络程序设计
热门文章
- 多媒体计算机系统是能进行获取,第六章 7 多媒体计算机系统.pdf
- php 经纬度 摩卡 转换,WGS84经纬度坐标与WEB摩卡托坐标转换
- 去水印--《On the Effectiveness of Visible Watermarks》
- 使用sql来拼接语句,最终传入Mybatis中执行
- java jms过时了么_JMS Message正在从Hibernate获取过时的数据
- python缩进用什么键盘好_关于Python基础缩进和选择的介绍
- jdk、jre、jvm有什么区别?
- Python测试框架pytest(02)PyCharm设置运行pytest、pytest.main()
- Python游戏开发pygame模块,Python实现吃豆人,儿时的回忆
- 微型计算机系统结构的五大基本组成部件,连接计算机系统结构的五大基本组成部件...