《HowTomcatWorks》这本书看得差不多了,Tomcat的工作原理也了解了。到了实战Tomcat源码的时候了。《HowTomcatWorks》的内容是关于Tomcat4和Tomcat5的,已经是10年前的货了……现在Tomcat8都出来了,但是我还是决定看看Tomcat7的源码。
首先要下载源码,并在Eclipse中创建项目,开始时根据其他网友们的攻略进行源码运行环境的搭建,在用Ant Build源码的时候,出现了各种错误啊,研究了build.xml半天也解决不了,实在郁闷。后来无意看到有网友发的阿帕奇的文档,链接是http://tomcat.apache.org/tomcat-7.0-doc/building.html,其中有一项是“Building with Eclipse”,认真开完后,发现其实很简单!如原文所说“An Ant target is provided as a convenience to download all binary dependencies, and to create the Eclipse project and classpath files in the root of the source tree. ”
下面是我搭建环境的步骤:
1、安装ant
如果机器上已经安装了ant可以省略这一步,否则去ant官网(http://ant.apache.org/bindownload.cgi)下载最新版ant Binary Distributions,解压到某个目录下,如D:\Program Files\apache-ant-1.9.3,然后配置环境变量。要么新建个ANT_HOME,值为ant路径,然后在PATH中添加ant bin路 径为%ANT_HOME%/bin,要么直接在PATH中添加ant bin路径为D:\Program Files\apache-ant-1.9.3\bin。配置好后,在cmd下运行ant -version,如果显示版本说明配置成功,我们就可以随地使用ant了。
2、下载Tomcat7源码
Tomcat源码,下载地址是http://tomcat.apache.org/download-70.cgi
3、解压源码
把下载下来的源码(压缩包)进行解压,我解压到E:\tomcat_src\tomcat7_src目录。
4、使用Ant编译
运行CMD,进入目录E:\tomcat_src\tomcat7_src中,运行命令 ant ide-eclipse
然后等着吧,ant会下载一堆编译Tomcat所依赖的包,下载速度根据网络情况而定。我第一次build,网络速度奇差,等了好久好久,最后还是Build Fail了,提示socket连接超时。然后第二天一早我重新Build,网络好,不到十分钟就搞定了……
Ant成功后,会提示 build success !
ant ide-eclipse命令,会编译Tomcat,在 ${tomcat.source}目录(我这里是E:\tomcat_src\tomcat7_src)中生成一个output文件夹,其中的build文件夹就是可以运行的Tomcat的主目录。
5、把Tomcat源码项目导入Eclipse
ant ide-eclipse命令成功结束后,会在 ${tomcat.source}目录生成Eclipse的项目文件(.classpath等),我们只需打开Eclipse,Import Existing Project Into Workspace便可!
导入项目后,项目有红叉,是因为Eclipse找不到Tomcat给的jar包。只要找到所需jar包,添加到项目中即可。我在 ${tomcat.source}目录中创建ext-lib文件夹,把所需的jar复制进去,然后再引入项目中。最终,项目所需jar如下图所示(JRE我选择JDK7):
所用到的jar,可以到此处下载:链接:http://pan.baidu.com/s/1i3HYu49 密码:x87v
添加jar包后,刷新一下项目,发现有几个类有错误。
这里关系到了Jdk1.8 。这么先进的东西,我还“不会用”呢。所以改一下代码,改成1.7的。
开始运行Tomcat。Tomcat运行的main方法,在org.apache.catalina.startup.Bootstrap类中,找到这个类,右键选择Debug As->Debug Configurations
在Argument中设置jvm的运行参数:
可以输入绝对路径,比如我的是
-Dcatalina.home="E:\tomcat_src\tomcat7_src\output\build"
最后,在Bootstrap.java进行Debug As,就可以启动Tomcat了!浏览器输入http://localhost:8080/,出现root界面。成功!