查看tomcat启动文件都干点啥:Bootstrap.java

在上一章查看tomcat启动文件都干点啥---catalina.bat,说了在catalina.bat中都走了什么流程,最重要的是,我们得出了如下这段命令:

_EXECJAVA=start "Tomcat" "E:\Program Files\Java\jdk1.7.0_40\bin\java" JAVA_OPTS= -Djava.util.logging.config.file="F:\apache-tomcat-7.0.8\conf\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager CATALINA_OPTS= DEBUG_OPTS= -Djava.endorsed.dirs="F:\apache-tomcat-7.0.8\endorsed" -classpath "F:\apache-tomcat-7.0.8\bin\bootstrap.jar;F:\apache-tomcat-7.0.8\bin\tomcat-juli.jar" -Dcatalina.base="F:\apache-tomcat-7.0.8" -Dcatalina.home="F:\apache-tomcat-7.0.8" -Djava.io.tmpdir="F:\apache-tomcat-7.0.8\temp" MAINCLASS=org.apache.catalina.startup.Bootstrap CMD_LINE_ARGS= ACTION=start

其中很重要的一个属性是:MAINCLASS=org.apache.catalina.startup.Bootstrap,Bootstrap在bootstrap.jar中,我们看一下Bootstrap的类图:

从每个变量和方法的名字的字面上也能大概看出来变量或者方法的作用。

很显然,程序走到Bootstrap的时候首先调用main方法,main方法是通过脚本启动tomcat的入口,我们看一下main方法中实现的内容:

if (daemon == null) {
            // Don't set daemon until init() has completed
            Bootstrap bootstrap = new Bootstrap();
            try {
                bootstrap.init();
            } catch (Throwable t) {
                handleThrowable(t);
                t.printStackTrace();
                return;
            }
            daemon = bootstrap;
        } else {
            // When running as a service the call to stop will be on a new
            // thread so make sure the correct class loader is used to prevent
            // a range of class not found exceptions.
            Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);
        }

        try {
            String command = "start";
            if (args.length > 0) {
                command = args[args.length - 1];
            }

            if (command.equals("startd")) {
                args[args.length - 1] = "start";
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stopd")) {
                args[args.length - 1] = "stop";
                daemon.stop();
            } else if (command.equals("start")) {
                daemon.setAwait(true);
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stop")) {
                daemon.stopServer(args);
            } else if (command.equals("configtest")) {
                daemon.load(args);
                if (null==daemon.getServer()) {
                    System.exit(1);
                }
                System.exit(0);
            } else {
                log.warn("Bootstrap: command \"" + command + "\" does not exist.");
            }
        } catch (Throwable t) {
            // Unwrap the Exception for clearer error reporting
            if (t instanceof InvocationTargetException &&
                    t.getCause() != null) {
                t = t.getCause();
            }
            handleThrowable(t);
            t.printStackTrace();
            System.exit(1);
        }

可以看出main方法主要实现了两个功能:

(1)初始化一个守护进程变量。

(2)加载参数,解析命令,并执行。

下面是初始化守护进程的执行过程:

if (daemon == null) {
            // Don't set daemon until init() has completed
            Bootstrap bootstrap = new Bootstrap();
            try {
                bootstrap.init();
            } catch (Throwable t) {
                handleThrowable(t);
                t.printStackTrace();
                return;
            }
            daemon = bootstrap;
        } else {
            // When running as a service the call to stop will be on a new
            // thread so make sure the correct class loader is used to prevent
            // a range of class not found exceptions.
            Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);
        }

可以看到在bootstrap.init()方法中对bootstrap变量进行初始化,然后将结果返回给daemon。下面看一下init方法中的实现:

public void init()
        throws Exception
    {

        // Set Catalina path
        setCatalinaHome();
        setCatalinaBase();

        initClassLoaders();

        Thread.currentThread().setContextClassLoader(catalinaLoader);

        SecurityClassLoad.securityClassLoad(catalinaLoader);

        // Load our startup class and call its process() method
        if (log.isDebugEnabled())
            log.debug("Loading startup class");
        Class<?> startupClass =
            catalinaLoader.loadClass
            ("org.apache.catalina.startup.Catalina");
        Object startupInstance = startupClass.newInstance();

        // Set the shared extensions class loader
        if (log.isDebugEnabled())
            log.debug("Setting startup class properties");
        String methodName = "setParentClassLoader";
        Class<?> paramTypes[] = new Class[1];
        paramTypes[0] = Class.forName("java.lang.ClassLoader");
        Object paramValues[] = new Object[1];
        paramValues[0] = sharedLoader;
        Method method =
            startupInstance.getClass().getMethod(methodName, paramTypes);
        method.invoke(startupInstance, paramValues);

        catalinaDaemon = startupInstance;

    }

init方法中对classLoader进行了初始化,设置了引用的catalinaDaemon变量。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索bootstrap
, command
, 方法
, args
, daemon
, catalina.bat
daemon启动
,以便于您获取更多的相关知识。

时间: 2024-12-17 00:56:08

查看tomcat启动文件都干点啥:Bootstrap.java的相关文章

j2ee-tomcat启动文件设置自定义参数

问题描述 tomcat启动文件设置自定义参数 我想在tomcat启动读取的catalina.bat文件中设置参数,set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS% -Dadsl.configfile=F:beawl8beaconfig.ini -Dadsl.config=config.ini,但在javaweb代码里用getproperty("adsl.configfile")却获取不到,跪求大神解答 解决方案 indows下启动Tomcat的方法有两种,一种是

osx 下的tomcat 配置,tomcat的文件路径怎么查看

问题描述 osx 下的tomcat 配置,tomcat的文件路径怎么查看 初学小白,在网上搜索都是说按照那个文件路径启动 tomcat 里bin/startup.sh文件, 可是osx10.1里面的文件路径是中文,将下载后的tomcat放在桌面上,应该在终端里怎么 输入这个文件路径? 解决方案 tomcat不要装在中文路径下面. 配置文件在etc/apache2下面 解决方案二: context 下 有个 app 路径

javaweb项目,tomcat启动异常报错,spring文件初始化问题,大神help

问题描述 javaweb项目,tomcat启动异常报错,spring文件初始化问题,大神help 本地启动没问题,把编译好的项目放到别的机器就不行,tomcat版本是一样的,都是8.0.12,jdk也是一样的,本地的系统是windows,另外一台是linux ERROR 2015-08-13 14:50:01,873 ContextLoader:initWebApplicationContext - Context initialization failed java.lang.NullPoin

spring mvc-Spring mvc+mybatis+maven的项目tomcat启动的时候,控制台不输出xml文件的加载信息

问题描述 Spring mvc+mybatis+maven的项目tomcat启动的时候,控制台不输出xml文件的加载信息 2014-3-17 9:52:18 org.apache.catalina.core.AprLifecycleListener init信息: Loaded APR based Apache Tomcat Native library 1.1.24 using APR version 1.4.6.2014-3-17 9:52:18 org.apache.catalina.co

tomcat启动正常,但无法连接到webapps下的文件

问题描述 tomcat启动正常,但无法连接到webapps下的文件 就是在webapps下随便写 了一个项目/junshi/index.html.但浏览器老是说拒绝连接请求,tomcat启动正常,但无法连接到webapps下的文件 解决方案 http://bbs.csdn.net/topics/390034800 解决方案二: tomcat正常启动,连接不上8080

【项目启动】 tomcat启动,项目无法启动,无法正常访问/项目可以启动,报错:java.lang.ClassNotFoundException: ContextLoaderListener

使用maven搭建项目(这个错误和是不是使用maven搭建项目没有关系),然后部署到tomcat中运行.   出现问题1: tomcat跑起来了,但是启动时间很短,没有报错,项目不能正常访问 项目启动时间很短,并且没有报错 并且项目无法正常访问   发现问题过程: 查看tomcat下,发现这个项目在tomcat的webapps下部署的仅仅是项目的部分文件,有好多的东西并没有部署进来 我们发现tomcat下部署的本项目中 并没有lib依赖包库 等目录.   解决途径: 因此我们需要通过  使用de

tomcat启动,闪一下就没了,怎么回事?

问题描述 解决方案 解决方案二:看一下$tomcat/logs目录下有什么错误日志.解决方案三:你是没配环境变量然后直接双击打开了么?这样好像不行的解决方案四:将tomcat下面的logs,work和temp目录清空,然后重启tomcat,看看报什么错误日志tomcat在只有JAVA_HOME环境变量的情况下可以启动的,如果你在环境变量中配置了tomcat_home和catalina_home的话,那不管你在哪里启动哪个tomcat,系统都会去启动你环境变量配置的那个tomcat解决方案五:查看

Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)_java

    用文本编辑工具打开用于启动Tomcat的批处理文件startup.bat,仔细阅读.在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOME的值.接着判断当前目录下是否存在bin\catalina.bat,如果文件不存在,将当前目录的父目录设为CATALINA_HOME的值.根据笔者机器上Tomcat安装目录的层次结构,最后CATALINA_HOME的值被设为Tomcat的安装目录.如果环境变量CATALINA_HOME已经存

eclipse中Tomcat启动失败 有哪些原因?

问题描述 我的eclipse使用一直有点问题,每次启动不是真正启动,用是可以用,但那个timeout时间走完了就停止了.如果把时间设置很长,就是右下方那个启动进度条一直存在:如果时间没走完手动停下服务,也会跳出来这样警告:我电脑网络用的是代理服务器,不知道是不是和这个有关系(但我更新eclipse是可以更新的啊).tomcat配置,java配置,eclipse配置我都和别的电脑上一样的,我也反复过几次了,甚至系统也重装过了.也听了别人建议把服务器配置选择serverlocation选了tomca