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号后停止维护,所以除非有历史遗留系统,不推荐再去读它的代码,
目前官方对这个分支进入维护、bugfix阶段,很少有新功能添加进来了,
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
然后再从这下载一个二进制分发包(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下的例子。
主要是添加几个依赖(ecj、ant、jaxrpc等),否则的话导入eclipse后会有编译错误,
另外,因为tomcat不是标准的maven工程项目,比如没有srcmainjava这样的目录,
所以要调整一下sourceDirectory和testSourceDirectory,下面是一个完整的pom文件,
直接放到D:Tomcat7目录即可(pom.xml与之前的launch、trunk目录并列)
- <project xmlns=“http://maven.apache.org/POM/4.0.0“ xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance“
- xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd“>
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>Tomcat7.0</artifactId>
- <name>Tomcat7.0</name>
- <version>7.0</version>
- <build>
- <finalName>Tomcat7.0</finalName>
- <sourceDirectory>trunk/java</sourceDirectory>
- <testSourceDirectory>trunk/test</testSourceDirectory>
- <resources>
- <resource>
- <directory>trunk/java</directory>
- </resource>
- </resources>
- <testResources>
- <testResource>
- <directory>trunk/test</directory>
- </testResource>
- </testResources>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.4</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jdt.core.compiler</groupId>
- <artifactId>ecj</artifactId>
- <version>3.7.2</version>
- </dependency>
- <dependency>
- <groupId>ant</groupId>
- <artifactId>ant</artifactId>
- <version>1.7.0</version>
- </dependency>
- <dependency>
- <groupId>wsdl4j</groupId>
- <artifactId>wsdl4j</artifactId>
- <version>1.6.2</version>
- </dependency>
- <dependency>
- <groupId>javax.xml</groupId>
- <artifactId>jaxrpc</artifactId>
- <version>1.1</version>
- </dependency>
- </dependencies>
- </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中显示:
- 2012-6-10 14:25:31 org.apache.catalina.startup.Catalina start
信息: Server startup in 359 ms
除上面这种方式外,这里还有一个Eclipse的launch脚本(start-tomcat7.launch (注: 在附件中)),
<?xml version=“1.0” encoding=“UTF-8” standalone=“no”?>
<launchConfiguration type=“org.eclipse.jdt.launching.localJavaApplication”> <listAttribute key=“org.eclipse.debug.core.MAPPED_RESOURCE_PATHS”> <listEntry value=“/Tomcat7.0/trunk/java/org/apache/catalina/startup/Bootstrap.java”/> </listAttribute> <listAttribute key=“org.eclipse.debug.core.MAPPED_RESOURCE_TYPES”> <listEntry value=“1”/> </listAttribute> <stringAttribute key=“org.eclipse.jdt.launching.MAIN_TYPE” value=“org.apache.catalina.startup.Bootstrap”/> <stringAttribute key=“org.eclipse.jdt.launching.PROGRAM_ARGUMENTS” value=“start”/> <stringAttribute key=“org.eclipse.jdt.launching.PROJECT_ATTR” value=“Tomcat7.0”/> <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”/> </launchConfiguration>
可以放到D:Tomcat7目录,然后flush一下Eclipse,在Eclipse中右击这个文件,点Run As启动Tomcat,点Debug As可以调试Tomcat。
最后,打开你的浏览器,输入 http://127.0.0.1:8080/examples/ 看看例子吧。
6. 简单的源代码阅读指南:
- 包名 用途
- =================================================
- javax servlet/jsp/el相关的api
- org.apache.catalina tomcat自身架构
- org.apache.coyote http、ajp协议实现相关的类
- org.apache.el 实现el规范
- org.apache.jasper 实现jsp规范、编译jsp文件
- org.apache.juli tomcat的日志系统
- org.apache.naming jndi实现
- 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。
本文来源于"阿里中间件团队播客",原文发表时间" 2012-06-12"
Tomcat7调试运行环境搭建与源代码分析入门相关推荐
- 大数据技术之Hadoop(入门)概述、运行环境搭建、运行模式
文章目录 1 Hadoop 概述 1.1 Hadoop 是什么 1.2 Hadoop 优势 1.3 Hadoop 组成(面试重点) 1.3.1 HDFS 架构概述 1.3.2 YARN 架构概述 1. ...
- 大数据之Hadoop3.x 运行环境搭建(手把手搭建集群)
文章目录 写在开头 安装包准备 一.Hadoop运行环境搭建(开发重点) 1.1 模板虚拟机环境准备 1.2 克隆虚拟机 1.3 在hadoop102安装JDK 1.4 在hadoop102安装Had ...
- Hadoop入门(上):大数据特点、大数据前景、大数据组织结构、Hadoop组成、Hadoop版本介绍、Hadoop运行环境搭建、CentOS6安装JDK、安装Hadoop、Hadoop目录结构
资料来源于尚硅谷 本篇文章目录 第1章·大数据概论 1.1.大数据概念. 1.2.大数据特点(4V) 1.3.大数据应用场景 1.4.大数据发展前景 1.5·大数据部门业务流程分析. 1.6·大数据部 ...
- 2012 iis php mysql_Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建wordpress博客教程
Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程 一.环境说明: 操作系统:Windows Server2012 R2 PHP版本:php 5.5.8 MySQ ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system )
文章目录 一.运行环境搭建 Android 模拟器安装 二.拷贝 Android 平台可执行文件和动态库到 /data/system 目录下 一.运行环境搭建 Android 模拟器安装 使用低版本的 ...
- win2012 r2 iis php,Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建wordpress博客教程
运行环境搭建教程 一.环境说明: 操作系统:Windows Server2012 R2 PHP版本:php 5.5.8 MySQL版本:MySQL5.6.15 二.相关软件下载: 1.PHP下载地址: ...
- 虹科Automation softPLC | 虹科KPA MoDK运行环境与搭建步骤(2)——MoDK运行环境搭建
本系列文章旨在帮助读者对虹科KPA Automation体系进行一个简要的理解,并且能使用MoDK进行快速的上手操作,包括:虹科KPA Automation.虹科KPA MoDK简介,虹科KPA Mo ...
- 基于RK3308的ROS运行环境搭建和交叉编译
基于RK3308的ROS运行环境搭建和交叉编译 固件编译环境 准备工作 软件包安装 交叉编译工具链介绍 下载 SDK SDK 目录结构 全自动编译脚本 烧写镜像文件 第一步,编译固件(ubuntu18 ...
- Zephyr物联网操作系统之运行环境搭建(一)
对于zephyr这个实时嵌入式操作系统,可以先在x86架构上搭建运行环境,学习相关知识.之后,根据实际需求,再将操作系统移植到不同架构的MCU上. 一.环境搭建 准备工作:安装ubuntu操作系统 虚 ...
最新文章
- php中自己写的类放哪里,class类 - ThinkPHP 3.2.3,我有一个class,应该放在哪里?
- MailScanner相关规则设置
- Android 编译命令
- 跨链Cosmos(5)ABCI 接口
- Anaconda安装(ubuntu 14.04.03 LTS 64bit)
- 算法题存档20200627(树)
- python手机端编程环境_Python + Appium 环境搭建
- linux ----Inode的结构图
- linux启动mqtt_MQTT--linux安装部署(CentOS)
- 程序员如何变身IT讲师
- python操作系统接口错误_Python-接口自动化(四) - 许小猪 - 博客园
- ML-Agents案例之金字塔
- 【numpy】TypeError: only size-1 arrays can be converted to Python scalars
- 编译器处理虚函数的原理
- python del用法_python中del函数的用法详解
- 合工大路强java第四次作业第2题
- SDL是什么,能干什么,为什么我们要学习它?
- win10关闭自动更新(针对已经关闭windows update项,但系统仍自动更新的问题)
- windows server 2012 RD服务器
- EverBox开发笔记-4-如何使用Core Data
热门文章
- str.endswith可以传入集合数据类型,而不仅仅是字符串
- dict格式转字符串两种方法的区别
- re.search中与正则表达式*结合使用的注意事项
- 成功在两台电脑上安装了spark集群,mark下
- linux下socket上限,[100分]高分求关于linux socket上限解决方案
- Leetcode987 二叉树的垂序遍历
- 2016年6月份学习总结,读书《向着光亮那方》
- HTML5 基础知识(二)
- el-input中设置onkeypress事件是否匹配正则表达式显示输入内容的格式
- 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)