zoukankan      html  css  js  c++  java
  • Tomcat7调试运行环境搭建与源代码分析入门

    1. 需要准备好下面这些工具

    JDK 1.6+

    Maven 2或3

    TortoiseSVN 1.7+ (从1.7开始”.svn”目录集中放在一处了,不再每个目录下都放一份)

    Eclipse 3.5+

    这4个工具不在这里描述怎么配置了,如果你是有两三年开发经验的Java开发人员,正常来讲都一直在用了。

    另外,分析tomcat源代码不需要对这4个工具做什么特殊配置。

    2. 下载Tomcat的源代码

    Apache旗下的开源项目基本上都放在这: http://svn.apache.org/repos/asf

    里面包含了tomcat、struts、hadoop、hbase等流行的开源项目的源代码,

    可以直接用浏览器打开这个URL,或者用TortoiseSVN的Repository Browser打开它。

    tomcat的svn是: http://svn.apache.org/repos/asf/tomcat, 如下图所示:

    目前tomcat有4个大分支:

    5.5 : http://svn.apache.org/repos/asf/tomcat/tc5.5.x

    6.0 : http://svn.apache.org/repos/asf/tomcat/tc6.0.x

    7.0 : http://svn.apache.org/repos/asf/tomcat/tc7.0.x

    8.0 : http://svn.apache.org/repos/asf/tomcat/trunk

    5.5分支会在今年9月30号后停止维护,所以除非有历史遗留系统,不推荐再去读它的代码,

    6.0分支是比较成熟的,在生产环境用得比较多,

    目前官方对这个分支进入维护、bugfix阶段,很少有新功能添加进来了,

    我个人也不推荐读它的代码,代码相对7.0来讲比较脏乱。

    7.0分支完整实现了servlet 3.0规范,已陆续发布了27个小版本,己经稳定了,可用于生产环境,

    代码比5.5、6.0分支干净整洁得多,这也是我强烈向你推荐的版本。

    8.0分支主要关注web socket和spdy,正处于活跃开发阶段,代码变动比较频繁,保持关注即可。

    所以这篇文章讲的是7.0分支,研究tomcat推荐直接提取svn的源代码:

    用TortoiseSVN checkout这个svn的代码:http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk

    放到D:Tomcat7 runk (你可以换别的目录)

    然后再从这下载一个二进制分发包(Binary Distributions)

    http://labs.mop.com/apache-mirror/tomcat/tomcat-7/v7.0.27/bin/apache-tomcat-7.0.27.zip

    解压后放到D:Tomcat7,顺便把”apache-tomcat-7.0.27″重命名成launch吧,

    用这个二进制分发包而不是从源代码构建只是为了节省时间,

    直接用它conf目录里面的配置文件和webapps下的例子。

    3. 把它变成maven工程

    主要是添加几个依赖(ecj、ant、jaxrpc等),否则的话导入eclipse后会有编译错误,

    另外,因为tomcat不是标准的maven工程项目,比如没有srcmainjava这样的目录,

    所以要调整一下sourceDirectory和testSourceDirectory,下面是一个完整的pom文件,

    直接放到D:Tomcat7目录即可(pom.xml与之前的launch、trunk目录并列)

    (注: pom.xml文件在附件中)

    1. <project xmlns=“http://maven.apache.org/POM/4.0.0″ xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”    
    2.     xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>    
    3.     <modelVersion>4.0.0</modelVersion>    
    4.     
    5.     <groupId>org.apache.tomcat</groupId>    
    6.     <artifactId>Tomcat7.0</artifactId>    
    7.     <name>Tomcat7.0</name>    
    8.     <version>7.0</version>    
    9.     
    10.     <build>    
    11.         <finalName>Tomcat7.0</finalName>    
    12.         <sourceDirectory>trunk/java</sourceDirectory>    
    13.         <testSourceDirectory>trunk/test</testSourceDirectory>    
    14.         <resources>    
    15.             <resource>    
    16.                 <directory>trunk/java</directory>    
    17.             </resource>    
    18.         </resources>    
    19.         <testResources>    
    20.             <testResource>    
    21.                 <directory>trunk/test</directory>    
    22.             </testResource>    
    23.         </testResources>    
    24.         <plugins>    
    25.             <plugin>    
    26.                 <groupId>org.apache.maven.plugins</groupId>    
    27.                 <artifactId>maven-compiler-plugin</artifactId>    
    28.                 <version>2.3</version>    
    29.                 <configuration>    
    30.                     <source>1.6</source>    
    31.                     <target>1.6</target>    
    32.                 </configuration>    
    33.             </plugin>    
    34.         </plugins>    
    35.     </build>    
    36.     
    37.     <dependencies>    
    38.         <dependency>    
    39.             <groupId>junit</groupId>    
    40.             <artifactId>junit</artifactId>    
    41.             <version>4.4</version>    
    42.             <scope>test</scope>    
    43.         </dependency>    
    44.         <dependency>    
    45.             <groupId>org.eclipse.jdt.core.compiler</groupId>    
    46.             <artifactId>ecj</artifactId>    
    47.             <version>3.7.2</version>    
    48.         </dependency>    
    49.         <dependency>    
    50.             <groupId>ant</groupId>    
    51.             <artifactId>ant</artifactId>    
    52.             <version>1.7.0</version>    
    53.         </dependency>    
    54.         <dependency>    
    55.             <groupId>wsdl4j</groupId>    
    56.             <artifactId>wsdl4j</artifactId>    
    57.             <version>1.6.2</version>    
    58.         </dependency>    
    59.         <dependency>    
    60.             <groupId>javax.xml</groupId>    
    61.             <artifactId>jaxrpc</artifactId>    
    62.             <version>1.1</version>    
    63.         </dependency>    
    64.     </dependencies>    
    65.     
    66. </project>    

    4. 导入Eclipse

    在命令行窗口中进入D:Tomcat7目录,执行 mvn eclipse:eclipse 就可以转成eclipse工程项目了,

    然后打开eclipse,点”File->Import->General->Existing Projects into Workspace”,

    最后打开D:Tomcat7就能看到Tomcat7.0这个项目了。

    (如果eclipse装了m2e插件不用执行mvn eclipse:eclipse的,可以直接导入maven工程)

    5. 在Eclipse中让Tomcat跑起来

    在Eclipse中打开org.apache.catalina.startup.Bootstrap类,

    在编辑区右击,点”Run As->Run configurations”,然后双击”Java Aplication”就会出来一个新的”Bootstrap”,

    选中它,在右边点击”Arguments”那一栏,把下面的内容copy到”VM arguments”中:

    -Dcatalina.home=launch -Dcatalina.base=launch -Djava.endorsed.dirs=launch/endorsed -Djava.io.tmpdir=launch/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=launch/conf/logging.properties

    如下图:

    然后点run按钮,就可以启动tomcat了,启动成功会在Eclipse的console中显示:

    1. 2012-6-10 14:25:31 org.apache.catalina.startup.Catalina start    
    2. 信息: Server startup in 359 ms 

    除上面这种方式外,这里还有一个Eclipse的launch脚本(start-tomcat7.launch (注: 在附件中)),

    1. <?xml version=“1.0″ encoding=“UTF-8″ standalone=“no”?>    
    2. <launchConfiguration type=“org.eclipse.jdt.launching.localJavaApplication”>    
    3. <listAttribute key=“org.eclipse.debug.core.MAPPED_RESOURCE_PATHS”>    
    4. <listEntry value=“/Tomcat7.0/trunk/java/org/apache/catalina/startup/Bootstrap.java”/>    
    5. </listAttribute>    
    6. <listAttribute key=“org.eclipse.debug.core.MAPPED_RESOURCE_TYPES”>    
    7. <listEntry value=“1″/>    
    8. </listAttribute>    
    9. <stringAttribute key=“org.eclipse.jdt.launching.MAIN_TYPE” value=“org.apache.catalina.startup.Bootstrap”/>    
    10. <stringAttribute key=“org.eclipse.jdt.launching.PROGRAM_ARGUMENTS” value=“start”/>    
    11. <stringAttribute key=“org.eclipse.jdt.launching.PROJECT_ATTR” value=“Tomcat7.0″/>    
    12. <stringAttribute key=“org.eclipse.jdt.launching.VM_ARGUMENTS” value=“-Dcatalina.home=launch -Dcatalina.base=launch -Djava.endorsed.dirs=launch/endorsed -Djava.io.tmpdir=launch/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=launch/conf/logging.properties”/>    
    13. </launchConfiguration>    

    可以放到D:Tomcat7目录,然后flush一下Eclipse,在Eclipse中右击这个文件,点Run As启动Tomcat,点Debug As可以调试Tomcat。

    下图是Tomcat在Eclipse中的项目布局:

    最后,打开你的浏览器,输入 http://127.0.0.1:8080/examples/ 看看例子吧。

    6. 简单的源代码阅读指南:

    1. 包名                    用途    
    2. =================================================    
    3. javax                 servlet/jsp/el相关的api    
    4. org.apache.catalina   tomcat自身架构    
    5. org.apache.coyote     http、ajp协议实现相关的类    
    6. org.apache.el         实现el规范    
    7. org.apache.jasper     实现jsp规范、编译jsp文件    
    8. org.apache.juli       tomcat的日志系统    
    9. org.apache.naming     jndi实现    
    10. org.apache.tomcat     tomcat的工具包、net、digester xml解析器   

    阅读顺序:

    可以从org.apache.catalina.startup.Bootstrap这个类开始看起,

    然后到org.apache.catalina.startup.Catalina,

    在Catalina类中会触发conf/server.xml文件的解析,

    这时要看org.apache.tomcat.util.digester中的类,

    解析的过程中会用到org.apache.catalina.startup包中的很多RuleSet类,

    server.xml文件解析完后,会生成org.apache.catalina.core包中的各种StandardXXX类的实例,

    比如StandardServer、StandardService、StandardEngine等等,

    这些Standard组件都是有生命周期的,接着会调用他们的init、start等方法,

    会触发下面这些组件进入init、start状态

    org.apache.catalina.connector.Connector

    org.apache.coyote.http11.Http11Protocol

    org.apache.tomcat.util.net.JIoEndpoint

    在JIoEndpoint(或NioEndpoint、AprEndpoint)中会监听8080这样的端口,

    有请求进来了,就进行相关的io操作,接着转到org.apache.coyote包中的相应类进行协议解析,

    生成org.apache.catalina.connector.Request和org.apache.catalina.connector.Response实例,

    然后转到各种Valve、应用Filter,最后到达应用的Servlet/JSP。

    下图描述了Tomcat7的核心架构:

     
  • 相关阅读:
    async/await 的基础使用及原理简介
    ES6---new Promise()使用方法
    JS中三个点(...)是什么鬼?
    export与export default的区别
    原生页面和H5页面的优劣势分析
    原生页面与H5页面区别
    3月9日学习日志
    3月8日学习日志
    3月5日学习日志
    3月4日学习日志
  • 原文地址:https://www.cnblogs.com/rainy-shurun/p/5212627.html
Copyright © 2011-2022 走看看