• 深入刨析tomcat 之---第12篇 how tomcat works( 第17章 ) 解析catalina.bat 梳理启动流程


    我们如何启动tomcat呢? 答案是双击startup.bat文件,这个文件在bin目录下

    @echo off    不显示批处理命令

    rem Licensed to the Apache Software Foundation (ASF) under one or more
    rem contributor license agreements. See the NOTICE file distributed with
    rem this work for additional information regarding copyright ownership.
    rem The ASF licenses this file to You under the Apache License, Version 2.0
    rem (the "License"); you may not use this file except in compliance with
    rem the License. You may obtain a copy of the License at
    rem
    rem http://www.apache.org/licenses/LICENSE-2.0
    rem
    rem Unless required by applicable law or agreed to in writing, software
    rem distributed under the License is distributed on an "AS IS" BASIS,
    rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    rem See the License for the specific language governing permissions and
    rem limitations under the License.

    if "%OS%" == "Windows_NT" setlocal
    rem ---------------------------------------------------------------------------
    rem Start script for the CATALINA Server
    rem
    rem $Id: startup.bat 743401 2009-02-11 17:01:58Z markt $
    rem ---------------------------------------------------------------------------

    rem Guess CATALINA_HOME if not defined
    if not "%CATALINA_HOME%" == "" goto gotHome
    set CATALINA_HOME=.
    if exist "%CATALINA_HOME%incatalina.bat" goto okHome
    set CATALINA_HOME=..
    :gotHome
    if exist "%CATALINA_HOME%incatalina.bat" goto okHome
    echo The CATALINA_HOME environment variable is not defined correctly
    echo This environment variable is needed to run this program
    goto end
    :okHome

    set EXECUTABLE=%CATALINA_HOME%incatalina.bat

    rem Check that target executable exists
    if exist "%EXECUTABLE%" goto okExec
    echo Cannot find %EXECUTABLE%
    echo This file is needed to run this program
    goto end
    :okExec

    rem Get remaining unshifted command line arguments and save them in the
    set CMD_LINE_ARGS=
    :setArgs
    if ""%1""=="""" goto doneSetArgs       //如果第一个参数为" ",就是 在命令行敲入startup 命令;如果让%1不得"""" ,那么就这样输入 startup start
    set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1   如果有参数CMD_LINE_ARGS 变量的值为 参数1的值
    shift
    goto setArgs
    :doneSetArgs

    call "%EXECUTABLE%" start %CMD_LINE_ARGS%  最终的命令为  bincatalina.bat  start  

    :end

    以上批处理文件执行完成就变为了一句话,就是 在cmd 窗口中打   bincatalina.bat  start  

    那么接着执行catalina 批处理

    set CATALINA_OPTS=%CATALINA_OPTS% -Dsun.io.useCanonCaches=false

    rem Guess CATALINA_HOME if not defined
    if not "%CATALINA_HOME%" == "" goto gotHome
    set CATALINA_HOME=.
    if exist "%CATALINA_HOME%incatalina.bat" goto okHome
    set CATALINA_HOME=..
    :gotHome
    if exist "%CATALINA_HOME%incatalina.bat" goto okHome
    echo The CATALINA_HOME environment variable is not defined correctly
    echo This environment variable is needed to run this program
    goto end
    :okHome

    rem Get standard environment variables
    if exist "%CATALINA_HOME%insetenv.bat" call "%CATALINA_HOME%insetenv.bat"

    rem Get standard Java environment variables
    if exist "%CATALINA_HOME%insetclasspath.bat" goto okSetclasspath
    echo Cannot find %CATALINA_HOME%insetclasspath.bat
    echo This file is needed to run this program
    goto end
    :okSetclasspath
    set BASEDIR=%CATALINA_HOME%
    call "%CATALINA_HOME%insetclasspath.bat"

    rem Add on extra jar files to CLASSPATH
    if "%JSSE_HOME%" == "" goto noJsse
    set CLASSPATH=%CLASSPATH%;%JSSE_HOME%libjcert.jar;%JSSE_HOME%libjnet.jar;%JSSE_HOME%libjsse.jar
    :noJsse
    set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%inootstrap.jar

    if not "%CATALINA_BASE%" == "" goto gotBase
    set CATALINA_BASE=%CATALINA_HOME%
    :gotBase

    if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
    set CATALINA_TMPDIR=%CATALINA_BASE% emp
    :gotTmpdir

    rem ----- Execute The Requested Command ---------------------------------------

    echo Using CATALINA_BASE: %CATALINA_BASE%
    echo Using CATALINA_HOME: %CATALINA_HOME%
    echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
    echo Using JAVA_HOME: %JAVA_HOME%

    set _EXECJAVA=%_RUNJAVA%
    set MAINCLASS=org.apache.catalina.startup.Bootstrap
    set ACTION=start
    set SECURITY_POLICY_FILE=
    set DEBUG_OPTS=
    set JPDA=
    echo Using _EXECJAVA %_EXECJAVA%

    if not ""%1"" == ""jpda"" goto noJpda
    set JPDA=jpda
    if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
    set JPDA_TRANSPORT=dt_shmem
    :gotJpdaTransport
    if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
    set JPDA_ADDRESS=jdbconn
    :gotJpdaAddress
    shift
    :noJpda
    echo print 参数1 ""%1""
    if ""%1"" == ""debug"" goto doDebug
    if ""%1"" == ""embedded"" goto doEmbedded
    if ""%1"" == ""run"" goto doRun
    if ""%1"" == ""start"" goto doStart
    if ""%1"" == ""stop"" goto doStop

    echo Usage: catalina ( commands ... )
    echo commands:
    echo debug Start Catalina in a debugger
    echo debug -security Debug Catalina with a security manager
    echo embedded Start Catalina in embedded mode
    echo jpda start Start Catalina under JPDA debugger
    echo run Start Catalina in the current window
    echo run -security Start in the current window with security manager
    echo start Start Catalina in a separate window
    echo start -security Start in a separate window with security manager
    echo stop Stop Catalina
    goto end

    :doDebug
    shift
    set _EXECJAVA=%_RUNJDB%
    set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%....jakarta-tomcat-4.0catalinasrcshare"
    if not ""%1"" == ""-security"" goto execCmd
    shift
    echo Using Security Manager
    set SECURITY_POLICY_FILE=%CATALINA_BASE%confcatalina.policy
    goto execCmd

    :doEmbedded
    shift
    set MAINCLASS=org.apache.catalina.startup.Embedded
    goto execCmd

    :doRun
    shift
    if not ""%1"" == ""-security"" goto execCmd
    shift
    echo Using Security Manager
    set SECURITY_POLICY_FILE=%CATALINA_BASE%confcatalina.policy
    goto execCmd

    :doStart
    shift
    if not "%OS%" == "Windows_NT" goto noTitle
    set _EXECJAVA=start "Tomcat" %_RUNJAVA%
    echo Print _EXECJAVA %_EXECJAVA%
    goto gotTitle
    :noTitle
    set _EXECJAVA=start %_RUNJAVA%
    :gotTitle
    if not ""%1"" == ""-security"" goto execCmd
    shift
    echo Using Security Manager
    set SECURITY_POLICY_FILE=%CATALINA_BASE%confcatalina.policy
    goto execCmd

    :doStop
    shift
    set ACTION=stop
    goto execCmd

    :execCmd
    rem Get remaining unshifted command line arguments and save them in the
    set CMD_LINE_ARGS=
    :setArgs
    if ""%1""=="""" goto doneSetArgs
    set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
    shift
    goto setArgs
    :doneSetArgs

    rem Execute Java with the applicable properties
    if not "%JPDA%" == "" goto doJpda
    if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
    %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
    echo lastword %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

    goto end
    :doSecurity
    %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
    goto end
    :doJpda
    if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
    %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
    goto end
    :doSecurityJpda
    %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
    goto end

    :end

    最后打印的内容为

    D:devapache-tomcat-4.1.40in>catalina.bat start
    Using CATALINA_BASE: ..
    Using CATALINA_HOME: ..
    Using CATALINA_TMPDIR: .. emp
    Using JAVA_HOME: D:devJDK8
    Using _EXECJAVA "D:devJDK8injava"
    print 鍙傛暟1 ""start""
    Print _EXECJAVA start "Tomcat" "D:devJDK8injava"
    最终指令::==>  start "Tomcat" "D:devJDK8injava" -Dsun.io.useCanonCaches=false -Djava.endorsed.dirs="..commonendorsed" -classpath "D:devJDK8lib ools.jar;..inootstrap.jar" -Dcatalina.base=".." -Dcatalina.home=".." -Djava.io.tmpdir=".. emp" org.apache.catalina.startup.Bootstrap start

    start "Tomcat" 是启动一个新cmd 窗口命名为"Tomcat",那么最后的只看指令就是java  -classpath   ..inootstrap.jar"  org.apache.catalina.startup.Bootstrap start

    那么类路径在bin下面有一个 bootstrap.jar文件,如果你打开看就是

    org.apache.catalina.startup.Bootstrap类

        public static void main(String args[]) {
    
            // Set the debug flag appropriately
            for (int i = 0; i < args.length; i++)  {
                if ("-debug".equals(args[i]))
                    debug = 1;
            }
            
            // Configure catalina.base from catalina.home if not yet set
            if (System.getProperty("catalina.base") == null)
                System.setProperty("catalina.base", getCatalinaHome());
    
            // Construct the class loaders we will need
            ClassLoader commonLoader = null;
            ClassLoader catalinaLoader = null;
            ClassLoader sharedLoader = null;
            try {
    
                File unpacked[] = new File[1];
                File packed[] = new File[1];
                File packed2[] = new File[2];
                ClassLoaderFactory.setDebug(debug);
    
                unpacked[0] = new File(getCatalinaHome(),
                                       "common" + File.separator + "classes");
                packed2[0] = new File(getCatalinaHome(),
                                      "common" + File.separator + "endorsed");
                packed2[1] = new File(getCatalinaHome(),
                                      "common" + File.separator + "lib");
                commonLoader =
                    ClassLoaderFactory.createClassLoader(unpacked, packed2, null);
    
                unpacked[0] = new File(getCatalinaHome(),
                                       "server" + File.separator + "classes");
                packed[0] = new File(getCatalinaHome(),
                                     "server" + File.separator + "lib");
                catalinaLoader =
                    ClassLoaderFactory.createClassLoader(unpacked, packed,
                                                         commonLoader);
    
                unpacked[0] = new File(getCatalinaBase(),
                                       "shared" + File.separator + "classes");
                packed[0] = new File(getCatalinaBase(),
                                     "shared" + File.separator + "lib");
                sharedLoader =
                    ClassLoaderFactory.createClassLoader(unpacked, packed,
                                                         commonLoader);
            } catch (Throwable t) {
    
                log("Class loader creation threw exception", t);
                System.exit(1);
    
            }
    
            Thread.currentThread().setContextClassLoader(catalinaLoader);
    
            // Load our startup class and call its process() method
            try {
    
                SecurityClassLoad.securityClassLoad(catalinaLoader);
    
                // Instantiate a startup class instance
                if (debug >= 1)
                    log("Loading startup class");
                Class startupClass =
                    catalinaLoader.loadClass
                    ("org.apache.catalina.startup.Catalina");
                Object startupInstance = startupClass.newInstance();
    
                // Set the shared extensions class loader
                if (debug >= 1)
                    log("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);
    
                // Call the process() method
                if (debug >= 1)
                    log("Calling startup class process() method");
                methodName = "process";
                paramTypes = new Class[1];
                paramTypes[0] = args.getClass();
                paramValues = new Object[1];
                paramValues[0] = args;
                method =
                    startupInstance.getClass().getMethod(methodName, paramTypes);
                method.invoke(startupInstance, paramValues);
    
            } catch (Exception e) {
                System.out.println("Exception during startup processing");
                e.printStackTrace(System.out);
                System.exit(2);
            }
    
        }

    那么执行这个mian 方法,那么tomcat 的源码在哪里呢?

    具体为什么在这里,那么就要分析他的编译过程,下一篇就写下这个吧

  • 相关阅读:
    linux命令3
    sersync和rsync数据实时同步配置
    java web框架
    处理 json数据,base64合成图片
    day032进程池(重点)进程池的同步、异步方法,回调函数;管道、数据共享
    day031同步锁、信号量、事件、队列、生成者消费者模型、Jionablequeue
    day030进程的两种创建方法,验证进程的空间隔离,join等待子进程
    day029socketserver模块实现并发,线程、 ftp上传或下载,打印进度条
    day028两种粘包现象,两种解决粘包的方法,subprocess, struck模块
    day027OSI七层协议;tcp三次握手,四次挥手;tcp与udp的区别及两者的撰写方式
  • 原文地址:https://www.cnblogs.com/zytcomeon/p/15011546.html
Copyright © 2020-2023  润新知