先大致浏览一下整个启动过程吧。下面是org.apache.catalina.startup.Bootstrap的main函数。
我在eclipse调用的是start的命令,也就是传入main的参数是start
// 初始化, 构建org.apache.catalina.startup.Catalina实例,并赋值给catalinaDaemon
bootstrap.init();
// 把刚刚创建并初始化好的bootstrap赋值给bootstrap daemon object used by main.
daemon = bootstrap;
// 设置catalinaDaemon的await为true
daemon.setAwait(true);
// 将main的参数传递给org.apache.catalina.startup.Catalina实例:catalinaDaemon,调用catalinaDaemon的load方法
daemon.load(args);
// 调用catalinaDaemon的start来启动tomcat
daemon.start();
可见,Bootstrap只是一个接待员,真正管事的是org.apache.catalina.startup.Catalina实例:catalinaDaemon。下面再细看上面的几步:
1. bootstrap.init()
// Set Catalina path
setCatalinaHome();
setCatalinaBase();
// 初始化class loader
initClassLoaders();
// 初始化3个class loader,commonLoader是parent,catalinaLoader和sharedLoader是child
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();
}
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
// 为当前的线程设置class loader为catalinaLoader
Thread.currentThread().setContextClassLoader(catalinaLoader);
// 用catalinaLoader来加载Catalina类,并创建一个实例
Class<?> startupClass = catalinaLoader.loadClass ("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.newInstance();
// 将sharedLoader设置为startupInstance的父loader,利用反射,如同执行了下面这么一句:
startupInstance.setParentClassLoader(sharedLoader)
// 因为Catalina有这么一个方法。
/**
* Set the shared extensions class loader.
*
* @param parentClassLoader The shared extensions class loader.
*/
public void setParentClassLoader(ClassLoader parentClassLoader) {
this.parentClassLoader = parentClassLoader;
}
// 将建好的startupInstance赋值给catalinaDaemon
catalinaDaemon = startupInstance;
因此,初始话的过程,主要就是设置了Catalina path,初始化了三个class loader,并设置了他们的关系,
构建一个最终是为了org.apache.catalina.startup.Catalina的实例,并赋值给catalinaDaemon。以被后面调用。
2. daemon.load(args)也即catalinaDaemon.load, 创建并初始化一个新的服务器实例
// 初始化目录,命名
initDirs();
initNaming();
// 创建并执行server.xml解析器
Digester digester = createStartDigester();
// 将catalinaDaemon注入server组件(org.apache.catalina.core.StandardServer实例)
getServer().setCatalina(this);
// 重定向System输出流out和错误流err
initStreams();
// 启动这个新server组件
getServer().init();
// 输出服务器初始化时间,也即启动时间,因为后面在Bootstrap最后一步就直接调用start命令了。
3. daemon.start(); 也即是catalinaDaemon.start()
// 启动上面初始化好的server
getServer().start();
// 注册关闭钩子,这样你才能调用shutdown命令停止server
Runtime.getRuntime().addShutdownHook(shutdownHook);
// 等待关闭命令,监听关闭命令的port是8005
if (await) {
await();
stop();
}
大致的启动过程也就是这样了,还算比较清楚。接下来抽空看看getServer().init();
分享到:
相关推荐
在本资源中,我们关注的是`bootstrap-datepicker-1.9.0`,这是一个针对Bootstrap框架的日期选择器插件。这个插件允许用户以美观、易用的方式选择日期,常见于各种表单输入和日历应用。 Bootstrap Datepicker是基于...
**Angular UI Bootstrap** Angular UI Bootstrap 是一个由 AngularJS 社区开发的库,它提供了基于 ...通过深入理解这两个框架以及 "bootstrap-master" 中的源码,开发者可以创建出既美观又功能丰富的 web 应用程序。
bootstrap-3.3.7_Bootstrap 源码 .zip 免费下载 bootstrap-3.3.7-dist_ 用于生产环境的 Bootstrap .zip 免费下载 bootstrap-4.6.0-dist_用于生产环境的 Bootstrap .zip 免费下载 bootstrap-4.6.0_Bootstrap 源码 ....
《深入剖析Tomcat7源码》 Tomcat7是一款广泛使用的开源Java Servlet容器,它实现了Java EE中的Web应用服务器标准,尤其是Servlet和JSP规范。源码下载是开发者深入理解其内部工作原理的重要途径,本篇文章将围绕...
赠送jar包:swagger-bootstrap-ui-1.9.6.jar; 赠送原API文档:swagger-bootstrap-ui-1.9.6-javadoc.jar; 赠送源代码:swagger-bootstrap-ui-1.9.6-sources.jar; 赠送Maven依赖信息文件:swagger-bootstrap-ui-...
react-native-navigation-bootstrap, 基于 Bootstrap的基于xml的本地导航方案 react-native-navigation-bootstrap基于的基于vanilla的项目的克隆这里存储库以启动基于"react-native":"0.44.2","react":"16.0.0-alpha...
压缩包中的“bootstrap-editable.js”就是实现这一功能的关键文件,它集成了x-editable插件,使得BootstrapTable具备了行内编辑的能力。 首先,我们需要在HTML文件中引入必要的库,包括Bootstrap CSS和JS,...
在项目`AllenFang-react-bootstrap-table-b06fd5b`中,包含了`react-bootstrap-table`的源码和示例,这将帮助你深入理解其内部工作原理和如何扩展定制。你可以查阅源码学习如何实现特定功能,或者参考示例来快速上手...
Bootstrap3-Editable是一款基于Bootstrap框架的插件,主要用于在Bootstrap表格中实现行内编辑功能。这个插件使得用户可以直接在表格的每一行中编辑数据,而无需跳转到新的页面或者打开模态框,极大地提高了用户体验...
【标题】"管理系统系列--springboot-bootstrap 后台管理系统.zip" 涉及的主要知识点是Spring Boot和Bootstrap在构建后台管理系统的应用。Spring Boot是Java领域一个流行的微服务框架,而Bootstrap则是一种广泛使用的...
前端开源库-react-bootstrap-async-autocomplete使用react bootstrap的react bootstrap async autocomplete、async autocomplete组件
标题 "2020-03-12-build-your-own-bootstrap-kitten-css-源码.rar" 提供的信息表明,这个压缩包包含了构建一个自定义的 Bootstrap 主题,主题可能与“kitten”(小猫)相关的 CSS 源代码。Bootstrap 是一个流行的...
- Bootstrap v4.4.1- JQuery- Chart.js- perfect-scrollbar- Bootstrap-Multitabs- bootstrap-clockpicker- bootstrap-colorpicker- bootstrap-datepicker- bootstrap-datetimepicker- bootstrap-table- jquery-...
官方go1.6源码在我的开发板(ubuntu 14.04 armv7 32bit)上编译的bootstrap环境。可以配置一下环境变量直接使用,也可以以此作为go的编译环境编译官方的最新版本源码。源码编译一次比较耗时,特上传上来供爱好者使用...
本项目"springboot-jpa-activiti-bootstrap-master"正是一个将这三个技术进行深度整合的实例,旨在帮助开发者理解并掌握它们之间的协同工作方式。 首先,SpringBoot是Spring框架的一种轻量级实现,它简化了设置和...
Bootstrap-wysiwygt和bootstrap-wysihtml5是两个在Web开发中常用的富文本编辑器,它们基于流行的前端框架Bootstrap构建,旨在提供一个简洁且易于使用的界面来编辑HTML内容。这两个编辑器都允许用户以所见即所得...
压缩包里面有: 1.bootstrap-table-editable.js 2.bootstrap-editable.js 3.bootstrap-editable.css 用于bootstrap table实现x-editable的行单元格编辑
可编辑bootstrap-table及相关组件:bootstrap3、bootstrap-table相关、bootstrap-table-editable.js、bootstrap-editable.js、bootstrap-editable.css; 配合起来,可以实现可编辑bootstrap-table列表。代码实现: ...
压缩包里面有: 1.bootstrap-table-editable.js 2.bootstrap-editable.js 3.bootstrap-editable.css 用于bootstrap table实现x-editable的行单元格编辑
在"atom-bootstrap-master"这个压缩包中,我们可能找到的是该项目的主分支源码。通常,这会包含项目的配置文件、脚本、样式表、JavaScript代码以及其他必要的资源,这些都用于实现Atom编辑器的快速启动。其中,可能...