Tomcat Bootstrap
/**
* Bootstrap loader for Catalina. This application constructs a class loader for use in loading the Catalina internal * classes (by accumulating all of the JAR files found in the "server" directory under "catalina.home"), and starts the * regular execution of the container. The purpose of this roundabout approach is to keep the Catalina internal classes * (and any other classes they depend on, such as an XML parser) out of the system class path and therefore not visible * to application level classes. * * @author Craig R. McClanahan * @author Remy Maucherat */
public final class Bootstrap {
}
这段文字描述了Tomcat启动时Catalina引导加载器的作用,我来翻译并解析一下:
这是Catalina的引导加载器。该应用程序构建一个类加载器,用于加载Catalina内部类(通过累积"catalina.home"下"server"目录中找到的所有JAR文件),并启动容器的常规执行。采用这种迂回的方式,目的是将Catalina内部类(以及它们依赖的任何其他类,比如XML解析器)排除在系统类路径之外,因此不会被应用程序级别的类可见。
解析:
- Catalina是Tomcat服务器的核心组件,负责加载和管理Servlet、JSP等Web应用程序。
- 在启动过程中,Catalina需要加载自身的内部类,如容器类、加载器类等。
- 为了避免这些内部类与Web应用程序的类发生冲突,Catalina使用了一个专门的引导加载器。
- 这个引导加载器会扫描
catalina.home/server
目录下的所有JAR文件,将它们构建为一个单独的类加载器。 - 通过这种方式,Catalina内部类被加载到一个独立的类加载器中,与Web应用程序的类加载器相隔离。
- 这样做的目的是防止Catalina内部类污染Web应用程序的类加载环境,也防止Web应用程序的类影响Catalina的运行。
- 这种"绕圈"的加载方式保证了Catalina内部类与应用程序类的相互隔离,提高了安全性和稳定性。
总的来说,Catalina引导加载器采用了一种巧妙的设计,使Tomcat服务器的内核组件与部署的Web应用程序相互独立,从而确保整个系统的稳定运行。这种设计思路也体现了Java类加载器的强大功能和灵活性。
catalinaBaseFile 和 catalinaHomeFile
private static final File catalinaBaseFile;
private static final File catalinaHomeFile;
static {
// Will always be non-null
String userDir = System.getProperty("user.dir");
// Home first
String home = System.getProperty(Constants.CATALINA_HOME_PROP);
File homeFile = null;
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