先大致浏览一下整个启动过程吧。下面是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();
分享到:
相关推荐
angular-ui-bootstrap源码与demo完整版
django-admin-bootstrap-master.zip
bootstrap源代码,也可以直接到官方网站下载;
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 源码 ....
CoreUI-Free-Bootstrap-Admin-Template-master Bootstrap Bootstrap后台界面 管理页面
react-native-navigation-bootstrap, 基于 Bootstrap的基于xml的本地导航方案 react-native-navigation-bootstrap基于的基于vanilla的项目的克隆这里存储库以启动基于"react-native":"0.44.2","react":"16.0.0-alpha...
EXTJS4 类似于bootstrap的主题
前端项目-jasny-bootstrap,Additional features and components for Bootstrap
* 本js只是在bootstrap3-dialog的基础上进行的2次封装, * bootstrap3-dialog已经是非常好用了,调用也非常简单。 * 详情请访问:https://github.com/nakupanda/bootstrap3-dialog, * 这是原项目地址,可以自行...
2020-03-12-build-your-own-bootstrap-kitten-css-源码.rar
前端项目-react-bootstrap,Bootstrap 3 components built with React
react-bootstrap4 bootstrap4的react代码实现实例 npm
工作需要用到bootstrap-table(bootstrap table)。 网上找了例子参差不齐,实在不堪入目。 我只要最简单的例子,网上没有所需要的,只我自已整理一份了。 该demo包含5个可以运行的最基本的例子。 希望能得到像我...
BootStrap-wysiwygt和bootstrap-wysihtml5富文本编辑器
taurus-responsive-bootstrap3 admin
bootstrap-4.6.2下载bootstrap.min.cssbootstrap.bundle.min.jsbootstrap-4.6.2下载
压缩包里面有: 1.bootstrap-table-editable.js 2.bootstrap-editable.js 3.bootstrap-editable.css 用于bootstrap table实现x-editable的行单元格编辑
官方go1.6源码在我的开发板(ubuntu 14.04 armv7 32bit)上编译的bootstrap环境。可以配置一下环境变量直接使用,也可以以此作为go的编译环境编译官方的最新版本源码。源码编译一次比较耗时,特上传上来供爱好者使用...
可编辑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的行单元格编辑