




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Tomcat源码研究作者:陈康作品:原创QQ:26237933Email:22tomcat启动过程分析(1)以tomcat为例,看tomcat是怎样启动的。tomcat中有一个startup.bat 批处理文件,这个文件会启动另一个批处理文件 catalina.bat 而这个批处理会设置set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%binbootstrap.jar 也就是把bootstrap.jar所在目录加入classpath中,这样就可以通过jre来运行bootstrap.jar,我们看到在这个包中的 MANIFEST.MF的文件内容如下: Manifest-Version: 1.0Ant-Version: Apache Ant 1.6.5Created-By: 1.5.0_06-b05 (Sun Microsystems Inc.)Main-Class: org.apache.catalina.startup.BootstrapSpecification-Title: CatalinaSpecification-Version: 6.0Class-Path: commons-daemon.jar commons-logging-api.jar tomcat-juli.jar tomcat-coyote.jar 这里Main-Class: org.apache.catalina.startup.Bootstrap 指定了主函数所在的类,很显然,JVM通过这个文件找到 主函数,并进入这个类中的主函数入口执行。然后就一步步完成tomcat的启过程。tomcat启动批处理startup.batecho offif %OS% = Windows_NT setlocal /如果为window_nt系统,开始批处理文件中环境改动的本地化操作rem -rem Start script for the CATALINA Serverremrem $Id: startup.bat 467182 2006-10-23 23:47:06Z markt $rem -rem Guess CATALINA_HOME if not definedset CURRENT_DIR=%cd% /把环境变量CURRENT_DIR设置为当前批处理执行所在目录if not %CATALINA_HOME% = goto gotHome /如果CATALINA_HOME不等于,将路到跳到gotHome标志处set CATALINA_HOME=%CURRENT_DIR% /设置CATALINA_HOME等于当前批处理执行路径if exist %CATALINA_HOME%bincatalina.bat goto okHome /看catalina.bat文件是否存在,存在就转到okHome标志处,不存在向下执行。cd . /返回上一层目录set CATALINA_HOME=%cd% /设置CATALINA_HOME等于当前目录cd %CURRENT_DIR% /进入批处理执行所在目录:gotHomeif exist %CATALINA_HOME%bincatalina.bat goto okHome /查看catalina.bat是否存在,存在就转到okHome执行。echo The CATALINA_HOME environment variable is not defined correctly /不存在输出错误echo This environment variable is needed to run this programgoto end /输出错误后跳到最后结束批处理执行。:okHomeset EXECUTABLE=%CATALINA_HOME%bincatalina.bat /设置变量EXECUTABLE为catalina.bat所在的绝对路径rem Check that target executable existsif exist %EXECUTABLE% goto okExec /如果catalina.bat存在转到okExec执行。echo Cannot find %EXECUTABLE% /不存在输出错误信息并结束批处理执行。echo This file is needed to run this programgoto end:okExecrem Get remaining unshifted command line arguments and save them in theset CMD_LINE_ARGS= /设置变量CMD_LINE_ARGS:setArgsif %1= goto doneSetArgsset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1shiftgoto setArgs:doneSetArgscall %EXECUTABLE% start %CMD_LINE_ARGS% /调用批处理catalina.bat,start 后应为参数。:end注:此批处理的作用主要是为了设置CATALINA_HOME,并找到catalina.bat执行。tomcat启动批处理catalina.batecho offif %OS% = Windows_NT setlocalrem -rem Start/Stop Script for the CATALINA Serverremrem Environment Variable Prequisitesremrem CATALINA_HOME May point at your Catalina build directory.remrem CATALINA_BASE (Optional) Base directory for resolving dynamic portionsrem of a Catalina installation. If not present, resolves torem the same directory that CATALINA_HOME points to.remrem CATALINA_OPTS (Optional) Java runtime options used when the start,rem stop, or run command is executed.remrem CATALINA_TMPDIR (Optional) Directory path location of temporary directoryrem the JVM should use (java.io.tmpdir). Defaults torem %CATALINA_BASE%temp.remrem JAVA_HOME Must point at your Java Development Kit installation.rem Required to run the with the debug argument.remrem JRE_HOME Must point at your Java Runtime installation.rem Defaults to JAVA_HOME if empty.remrem JAVA_OPTS (Optional) Java runtime options used when the start,rem stop, or run command is executed.remrem JSSE_HOME (Optional) May point at your Java Secure Sockets Extensionrem (JSSE) installation, whose JAR files will be added to therem system class path used to start Tomcat.remrem JPDA_TRANSPORT (Optional) JPDA transport used when the jpda startrem command is executed. The default is dt_shmem.remrem JPDA_ADDRESS (Optional) Java runtime options used when the jpda startrem command is executed. The default is jdbconn.remrem JPDA_SUSPEND (Optional) Java runtime options used when the jpda startrem command is executed. Specifies whether JVM should suspendrem execution immediately after startup. Default is n.remrem JPDA_OPTS (Optional) Java runtime options used when the jpda startrem command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,rem and JPDA_SUSPEND are ignored. Thus, all required jpdarem options MUST be specified. The default is:remrem -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,rem address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%remrem $Id: catalina.bat 537518 2007-05-12 21:11:40Z markt $rem -rem Guess CATALINA_HOME if not definedset CURRENT_DIR=%cd% /设置当前所有目录if not %CATALINA_HOME% = goto gotHomeset CATALINA_HOME=%CURRENT_DIR% /设置CATALINA_HOME为当前目录if exist %CATALINA_HOME%bincatalina.bat goto okHomecd .set CATALINA_HOME=%cd%cd %CURRENT_DIR%:gotHomeif exist %CATALINA_HOME%bincatalina.bat goto okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programgoto end:okHomerem Get standard environment variablesif exist %CATALINA_HOME%binsetenv.bat call %CATALINA_HOME%binsetenv.bat /setenv.bat是否存在,如果存在将执行。rem Get standard Java environment variablesif exist %CATALINA_HOME%binsetclasspath.bat goto okSetclasspath /如果setclasspath.bat存在转到标志okSetclasspathecho Cannot find %CATALINA_HOME%binsetclasspath.bat /如果不存在,将退出。echo This file is needed to run this programgoto end:okSetclasspathset BASEDIR=%CATALINA_HOME% /设置BASEDIR等于tomcat所在目录,也就是bin上层目录call %CATALINA_HOME%binsetclasspath.bat %1 /调用setclasspath.bat执行。if errorlevel 1 goto end /如果执行发生错误将退出。rem Add on extra jar files to CLASSPATHif %JSSE_HOME% = goto noJsse /如果JSSE_HOME不存为空,将转到标志noJsse处set CLASSPATH=%CLASSPATH%;%JSSE_HOME%libjcert.jar;%JSSE_HOME%libjnet.jar;%JSSE_HOME%libjsse.jar /设置classpath等于自己再加上后面的两个。:noJsseset CLASSPATH=%CLASSPATH%;%CATALINA_HOME%binbootstrap.jar /把bootstrap.jar加入classpath中if not %CATALINA_BASE% = goto gotBaseset CATALINA_BASE=%CATALINA_HOME%:gotBaseif not %CATALINA_TMPDIR% = goto gotTmpdirset CATALINA_TMPDIR=%CATALINA_BASE%temp:gotTmpdirif not exist %CATALINA_BASE%perties goto noJuliset JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=%CATALINA_BASE%perties:noJulirem - Execute The Requested Command -echo Using CATALINA_BASE: %CATALINA_BASE%echo Using CATALINA_HOME: %CATALINA_HOME%echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%if %1 = debug goto use_jdkecho Using JRE_HOME: %JRE_HOME%goto java_dir_displayed:use_jdkecho Using JAVA_HOME: %JAVA_HOME%:java_dir_displayedset _EXECJAVA=%_RUNJAVA% /执行JAVAset MAINCLASS=org.apache.catalina.startup.Bootstrap /主方法类set ACTION=start /执行参数set SECURITY_POLICY_FILE=set DEBUG_OPTS=set JPDA=if not %1 = jpda goto noJpdaset JPDA=jpdaif not %JPDA_TRANSPORT% = goto gotJpdaTransportset JPDA_TRANSPORT=dt_shmem:gotJpdaTransportif not %JPDA_ADDRESS% = goto gotJpdaAddressset JPDA_ADDRESS=jdbconn:gotJpdaAddressif not %JPDA_SUSPEND% = goto gotJpdaSuspendset JPDA_SUSPEND=n:gotJpdaSuspendif not %JPDA_OPTS% = goto gotJpdaOptsset JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%:gotJpdaOptsshift:noJpdaif %1 = debug goto doDebugif %1 = run goto doRunif %1 = start goto doStartif %1 = stop goto doStopif %1 = version goto doVersionecho Usage: catalina ( commands . )echo commands:echo debug Start Catalina in a debuggerecho debug -security Debug Catalina with a security managerecho jpda start Start Catalina under JPDA debuggerecho run Start Catalina in the current windowecho run -security Start in the current window with security managerecho start Start Catalina in a separate windowecho start -security Start in a separate window with security managerecho stop Stop Catalinaecho version What version of tomcat are you running?goto end:doDebugshiftset _EXECJAVA=%_RUNJDB%set DEBUG_OPTS=-sourcepath %CATALINA_HOME%.javaif not %1 = -security goto execCmdshiftecho Using Security Managerset SECURITY_POLICY_FILE=%CATALINA_BASE%confcatalina.policygoto execCmd:doRunshiftif not %1 = -security goto execCmdshiftecho Using Security Managerset SECURITY_POLICY_FILE=%CATALINA_BASE%confcatalina.policygoto execCmd:doStartshiftif not %OS% = Windows_NT goto noTitleset _EXECJAVA=start Tomcat %_RUNJAVA%goto gotTitle:noTitleset _EXECJAVA=start %_RUNJAVA%:gotTitleif not %1 = -security goto execCmdshiftecho Using Security Managerset SECURITY_POLICY_FILE=%CATALINA_BASE%confcatalina.policygoto execCmd:doStopshiftset ACTION=stopgoto execCmd:doVersion%_EXECJAVA% -classpath %CATALINA_HOME%libcatalina.jar org.apache.catalina.util.ServerInfogoto end:execCmdrem Get remaining unshifted command line arguments and save them in theset CMD_LINE_ARGS=:setArgsif %1= goto doneSetArgsset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1shiftgoto setArgs:doneSetArgs/以下是执行的启动命令。rem Execute Java with the applicable propertiesif not %JPDA% = goto doJpdaif 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%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:doJpdaif not %SECURITY_POLICY_FILE% = goto doSecurityJpda%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_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:doSecurityJpda%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_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:endtomcat启动批处理setclasspath.batrem -rem Set CLASSPATH and Java optionsremrem $Id: setclasspath.bat 545668 2007-06-09 00:18:22Z markt $rem -rem Make sure prerequisite environment variables are setif not %JAVA_HOME% = goto gotJdkHomeif not %JRE_HOME% = goto gotJreHomeecho Neither the JAVA_HOME nor the JRE_HOME environment variable is definedecho At least one of these environment variable is needed to run this programgoto exit:gotJreHomeif not exist %JRE_HOME%binjava.exe goto noJavaHomeif not exist %JRE_HOME%binjavaw.exe goto noJavaHomeif not %1 = debug goto okJavaHomeecho JAVA_HOME should point to a JDK in order to run in debug mode.goto exit:gotJdkHomeif not exist %JAVA_HOME%binjava.exe goto noJavaHomeif not exist %JAVA_HOME%binjavaw.exe goto noJavaHomeif not exist %JAVA_HOME%binjdb.exe goto noJavaHomeif not exist %JAVA_HOME%binjavac.exe goto noJavaHomeif not %JRE_HOME% = goto okJavaHomeset JRE_HOME=%JAVA_HOME%goto okJavaHome:noJavaHomeecho The JAVA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programecho NB: JAVA_HOME should point to a JDK not a JREgoto exit:okJavaHomeif not %BASEDIR% = goto gotBasedirecho The BASEDIR environment variable is not definedecho This environment variable is needed to run this programgoto exit:gotBasedirif exist %BASEDIR%binsetclasspath.bat goto okBasedirecho The BASEDIR environment variable is not defined correctlyecho This environment variable is needed to run this programgoto exit:okBasedirrem Set the default -Djava.endorsed.dirs argumentset JAVA_ENDORSED_DIRS=%BASEDIR%endorsedrem Set standard CLASSPATHrem Note that there are no quotes as we do not want to introduce randomrem quotes into the CLASSPATHif not exist %JAVA_HOME%libtools.jar goto noJavacset CLASSPATH=%JAVA_HOME%libtools.jar:noJavacrem Set standard command for invoking Java.rem Note that NT requires a window name argument when using start.rem Also note the quoting as JAVA_HOME may contain spaces.set _RUNJAVA=%JRE_HOME%binjavaset _RUNJAVAW=%JRE_HOME%binjavawset _RUNJDB=%JAVA_HOME%binjdbset _RUNJAVAC=%JAVA_HOME%binjavacgoto end:exitexit /b 1:endtomcat批处理最后执行命令D:apache-tomcat-6.0.14binstartup.batUsing CATALINA_BASE: D:apache-tomcat-6.0.14Using CATALINA_HOME: D:apache-tomcat-6.0.14Using CATALINA_TMPDIR: D:apache-tomcat-6.0.14tempUsing JRE_HOME: C:Javajdk1.5.0_16start Tomcat C:Javajdk1.5.0_16binjava -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=D:perties -Djava.endorsed.dirs=D:apache-tomcat-6.0.14endorsed -classpath C:Javajdk1.5.0_16libtools.jar;D:apache-tomcat-6.0.14binbootstrap.jar -Dcatalina.base=D:apache-tomcat-6.0.14 -Dcatalina.home=D:apache-tomcat-6.0.14 -Djava.io.tmpdir=D:apache-tomcat-6.0.14temp org.apache.catalina.startup.Bootstrap start注:从中我们可以看到,其实启动tomcat就是一个 java -D -classpth org.apache.catalina.startup.Bootstrap start过程,设置资源,设置classpath,然后启动org.apache.catalina.startup.Bootstrap这个类的主方法main方法,带参数starttomcat原码目录结构及说明1)org.apache.catalina.startup :启动相关的一类.2)org.apache.catalina :tomcat的核心接口3)org.apache.catalina.core :tomcat的核心接口实现类.tomcat(1)之Bootstrap.java此类的作用,就是 * Initialize daemon. 初始化 * 主要有以下过程 * 1)设置环境变量,初始化类加载器,事实上就是为commonLoader,catalinaLoader,sharedLoader,不过这里其实都为 * commonLoader,因为其它几个并没配置,配置文件位于 org.apache,catalina.startup中的perties。 common.loader=$catalina.home/lib,$catalina.home/lib/*.jar server.loader= shared.loader= * 2)设置当前线程当前类加载器,也是commonLoader,其实commonLoader就是批向tomcat/lib中的一个加载器. 也是tomcat的核心类库的加载位置,相然用的一些包也可以放在这个目录,同样可以被tomcat默认加载器 加载。 * 3)加载org.apache.catalina.startup.Catalina,并设置父加载器为commonLoader,最后把实例附值给catalinaDaemon 通过反射方式得到Catalina实例,同时设置Catalina的一个属性(也就是父加载器)为:commonLoader 然后把实例传给属性catalinaDaemon,其它方法通这个实例来操作类Catalina的实例。 * 初始化完成. * 从这个初始化来看,只处理两个方面,1)设置加载器 2)产生Catalina实例 * 然后如一些start,load,stop都是调用类Catalina中相应方法来完成.(利用反射的方式) 我们看批处理最后执行的命令为:.apache.catalina.startup.Bootstrap start,显然带的参数是start. 在启动时主要执行Catalina实例的二个方法: 1)load 2)start 源码: daemon.load(args); /加载参数,这里args为main方法中的参数,从最后批处理执行来看,只一个参数start,因此 /args中只有一个元素的数组,这个元素值为:start daemon.start(); 我们来看看方法Bootstrap中的load做了什么事。 - /* * Load daemon. */ private void load(String arguments) throws Exception / Call the load() method String methodName = load; Object param; /定义参数 Class paramTypes; /定义方法参数类型 if (arguments=null | arguments.length=0) paramTypes = null; param = null; else paramTypes = new Class1; paramTypes0 = arguments.getClass(); param = new Object1; param0 = arguments; Method method = catalinaDaemon.getClass().getMethod(methodName, paramTypes); if (log.isDebugEnabled() log.debug(Calling startup class + method); method.invoke(catalinaDaemon, param); 注:从原码看得出来,这个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师招聘之《小学教师招聘》预测复习含完整答案详解(历年真题)
- 竹材采运机械化优化-洞察及研究
- 建筑施工方案汇报内容
- 江津别墅铝扣板施工方案
- 建筑咨询营销方案
- 数字孪生技术在智慧城市能源管理中的应用与挑战2025年研究报告
- 滨州市安全生产专家培训课件
- 收费站围墙施工方案
- 公路施工方案审核记录表
- 人物建筑夜景调色方案设计
- 2025+CSCO胃癌诊疗指南解读
- 一级消防工程师消防安全技术综合能力考试真题卷(2025年)
- 南通市2025届高三第二次调研测试语文试题含答案
- 《科研经费管理》课件
- 成都市商品房购买(预售)合同标准版5篇
- 腹膜透析护理科普宣教
- 银行卡借用协议
- 二年级道德与法治上册 第四单元 我们生活的地方 16 家乡新变化教学实录 新人教版
- 食堂经理年度工作总结
- 小米生态链企业的协同发展与供应链优化
- 2025年湖南工程职业技术学院单招职业适应性测试题库必考题
评论
0/150
提交评论