上一篇文章分析了通过startup.bat启动Tomcat相当于执行如下代码,即运行Bootstrap start
start "Tomcat" "C:\Program Files\Java\jdk1.7.0_51\bin\java"
-Djava.util.logging.config.file="D:\Program Files\apache-tomcat-8.0.3\conf\logging.properties"
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.endorsed.dirs="D:\Program Files\apache-tomcat-8.0.3\endorsed"
-classpath "D:\Program Files\apache-tomcat-8.0.3\bin\bootstrap.jar;D:\Program Files\apache-tomcat-8.0.3\bin\tomcat-juli.jar"
-Dcatalina.base="D:\Program Files\apache-tomcat-8.0.3"
-Dcatalina.home="D:\Program Files\apache-tomcat-8.0.3"
-Djava.io.tmpdir="D:\Program Files\apache-tomcat-8.0.3\temp"
org.apache.catalina.startup.Bootstrap start
今天来看看Bootstrap的执行流程
1. 执行static块
为什么没有执行main方法,而先执行static块呢?
原来一个类的运行,JVM做会以下几件事情:类装载、链接、初始化、实例化,而初始化阶段做的事情是初始化静态变量和执行静态方法等
static块的作用是设置catalinaBaseFile、catalinaHomeFile
static块:
static {
// Will always be non-null
//System.getProperty("user.dir"),获取当前目录
//由于是在$CATALINA_HOME\bin下运行的Bootstrap,所以userDir为$CATALINA_HOME\bin
String userDir = System.getProperty("user.dir");
// Home first
//Globals是存放全局常量的类
//Globals.CATALINA_HOME_PROP = "catalina.home"
//catalina.home在运行Bootstrap时已设置(Tomcat的根目录)
String home = System.getProperty(Globals.CATALINA_HOME_PROP);
File homeFile = null;
//获取Tomcat的绝对路径
if (home != null) {
File f = new File(home);
try {
homeFile = f.getCanonicalFile();
} catch (IOException ioe) {
homeFile = f.getAbsoluteFile();
}
}
if (homeFile == null) {
// First fall-back. See if current directory is a bin directory
// in a normal Tomcat install
File bootstrapJar = new File(userDir, "bootstrap.jar");
if (bootstrapJar.exists()) {
File f = new File(userDir, "..");
try {
homeFile = f.getCanonicalFile();
} catch (IOException ioe) {
homeFile = f.getAbsoluteFile();
}
}
}
if (homeFile == null) {
// Second fall-back. Use current directory
File f = new File(userDir);
try {
homeFile = f.getCanonicalFile();
} catch (IOException ioe) {
homeFile = f.getAbsoluteFile();
}
}
//设置catalinaHomeFile
catalinaHomeFile = homeFile;
System.setProperty(
Globals.CATALINA_HOME_PROP, catalinaHomeFile.getPath());
// Then base
String base = System.getProperty(Globals.CATALINA_BASE_PROP);
//设置catalinaBaseFile
if (base == null) {
catalinaBaseFile = catalinaHomeFile;
} else {
File baseFile = new File(base);
try {
baseFile = baseFile.getCanonicalFile();
} catch (IOException ioe) {
baseFile = baseFile.getAbsoluteFile();
}
catalinaBaseFile = baseFile;
}
System.setProperty(
Globals.CATALINA_BASE_PROP, catalinaBaseFile.getPath());
}
对比getAbsoluteFile()、getCanonicalFile()
getAbsoluteFile获取绝对文件(如果文件路径中包含.和..,不解析)
getC