从源码安装 tomcat 6.0.18
注意事项:
JDK 用 1.6
1 安装 Subversion
l 下载地址: http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
l 当然,如果您想从 Eclipse 中直接导入 Tomcat 源代码,请从 http://subclipse.tigris.org/update_1.0.x 下载 Subversion 插件,即可导入 Tomcat 源代码。
l 安装完成后,请在 MS-DOS 窗口中键入 svn export help ,验证是否安装成功
2 下载 Tomcat6.0 的源代码
l Tomcat 源代码的版本控制工具不是 CVS ,而是 Subversion ,
l 在 MS-DOS 下键入:
svn export http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_18/ G:\tomcat_6.0.18\src |
这个命令的意思是把 Tomcat6.0.18 的源代码从 Subversion 库中导入到本机的 G:\tomcat_6.0.18\src 目录,
l 下面是源代码的目录结构,从这个目录结构中,我们可以看出该项目的开发者使用的 IDE 是 Eclipse ,因为我们看到了熟悉的 .project 及 .classpath 文件。
bin | 脚本文件 |
conf | xml 和 properties 配置文件 |
java | Java 源码文件 |
res | 资源文件比如说图片文件, ini 文件及其它的一些静态资源文件 |
test | 测试源代码 |
3 安装 Ant
请从 http://ant.apache.org/bindownload.cgi 处下载并安装
4 下载 依赖项目
l Tomcat 以 Ant 作为编译工具
l 修改 build.properties
找到 Tomcat 的源代码中的 build.properties.default 文件,将该文件复制到 build.properties ,
然后打开 build.properties ,找到下面这行:
base.path=/usr/share/java
将它改为:
base.path= G:/tomcat_6.0.18/src/share
在 Tomcat 编译过程中, Ant 会让我们下载一些必要的依赖项目, base.path 目录就是用来保存这些项目文件的,我们可以将这个属性指向一个已经存在的目录。
l 修改完 base.path 后,我们回到 MS-DOS 窗口,切换到 Tomcat 源代码所在目录,然后运行 ant download 命令
cd G:\tomcat_6.0.18\src c:\apache-ant-1.7.1\bin\ant download |
一分钟未到, Ant 就告诉我们一个错误并提示我们编译失败,就是找不到 http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip 文件。
Tomcat 的编译和 Eclipse 的 JDT 有什么关系?是因为 Tomcat 是在 Eclipse 下开发的,
所以需要 Eclipse 的 JDT ( Java Development tooling )插件来编译 Tomat 源代码。既然找不到,我们只好自己动手,上 Google 一搜,马上发现这个文件的有效下载地址为: http://mirror.calvin.edu/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip 。我们 打开 刚才的build.properties 文件,将其 34 行修改为:
jdt.loc= http://mirror.calvin.edu/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip |
Tomcat 6.0.0 需要改这个,Tomcat 6.0.18 不需要改这个选项了
l 修改保存build.properties 文件后,重新开始ant download 任务。
这次我们等的时间较长,因为 eclipse-JDT-3.2.zip 大约有19M ,下载需要一段时间。
编译成功,虽然编译器给出几个警告。
…… BUILD SUCCESSFUL Total time: 15 minutes 17 seconds |
l 这时我们可发现刚才创建的base.path 目录(G:\tomcat_6.0.18\src\share )中已经下载了6 个依赖项目,它们都是Tomcat 编译所必须的。
l 配置代理
修改 build.properties 文件:添加如下内容
proxy.host=192.168.0.1
proxy.port=808
proxy.use=on
5 编译
请在MS-DOS 窗口内键入ant 并回车,
c:\apache-ant-1.7.1\bin\ant |
Ant 将在2 分钟内编译1000 多个源文件并将Tomcat 部署到output 目录。
编译顺利完成后,请打开Tomcat 的源代码目录,会发现多了一个output 目录,这是Ant 的编译后的输出目录。
…… BUILD SUCCESSFUL Total time: 1 minute 31 seconds |
6 运行 tomcat
请打开Tomcat 源代码的output\build\bin 子目录,双击startup.bat 文件,我们即可成功启动Tomcat6.0 ,此时我们的编译工作就算顺利完成了。
http://127.0.0.1:8080/ |
7 导入源代码到 Eclipse
7.1 新建一个 Java 项目
请打开Eclipse ,新建一个Java 项目,请选择 “ Create project from existing source ” , 并在Directory 文本框内填入我们刚才下载的Tomcat 源代码目录(i.e. G:\tomcat_6.0.18\src) ,然后点击 “ Next ” 直至结束。
7.2 指定库文件
我们将会看到Eclipse 拒绝编译,这是因为Eclipse 找不到该项目指定的库文件。请右击该项目,在弹出菜单中选择 “ Properties ” => “ Libraries ” ,然后删除两个以TOMCAT_LIBS 开头的两个库文件,只保留一个JRE 库文件,然后点击 “ OK ” 按钮,这时Eclipse 开始编译Tomcat 源代码,但是发现一堆错误,这是因为我们没有为该项目添加编译所必须的Jar 包。
准备好 Tomcat 项目所必须的 jar 文件,其实,刚才我们运行 ant download 任务时,已经下载过这些 jar 文件包。
ant.jar | (请在 ant 安装目录的 lib 子目录中拷贝) |
commons-collections-3.2.jar | (从刚才 Ant 下载的 share\commons-collections-3.2-src 子目录中拷贝) |
commons-dbcp-1.2.2.jar | (从刚才 Ant 下载的 share\commons-dbcp-1.2.2-src 子目录中拷贝) |
commons-logging-1.1.jar | (如果您本机没有这个 jar 包,请从 http://commons.apache.org/downloads/download_logging.cgi 处下载) |
commons-pool-1.2.jar | (如果在刚才下载的 share\commons-pool-1.4-src 的目录中找不到,可以执行这个命令来得到 jar 文件 c:\apache-ant-1.7.1\bin\ant build-jar ) |
org.eclipse.jdt.core_3.3.1.v_780_R33x.jar | (从刚才 Ant 下载的 share\eclipse\plugins 子目录中拷贝) |
jaxrpc.jar wsdl4j-1.5.1.jar | 到 http://ws.apache.org/axis/ 下载。
|
当我们准备好这些 jar 文件后,将这些文件拷贝到某一目录(比如说 G:\tomcat_6.0.18\tomcat_lib 目录),
然后在 Eclipse 中新建一个 User Libraries ,我们将这个新建的 User Libraries 命名为 TOMCAT_LIBS ,并把这些文件加到 TOMCAT_LIBS 。然后将我们新建的 TOMCAT_LIBS 添加到 Tomcat6 项目。另外,别忘了把 JUnit 库也加到 Tomcat6 项目。这时 Eclipse 开始重新编译,编译过程顺利通过,所有错误均消失,此时 Tomcat6 项目的目录结构如下:
7.3 把 test 目录也加入到源代码中
方法是在 Eclipse 中右击” test ”目录,然后在弹出菜单中选择“ Build path ” => ” Use as Source Folder ”,之后我们会看到 test 目录上就多了个源代码的符号。
8 在 Eclipse 中运行 Tomcat 。
请找到 Tomcat 的启动主类 org.apache.catalina.startup.Bootstrap ,右击这个类,在弹出菜单中选择“ Run As …” => ” Open Run Dialog …”,然后在弹出的“ Run ”窗口中填入程序运行参数“ start ”和 JVM 运行参数 catalina.home ,
程序运行参数 : start
JVM 运行参数 : -Dcatalina.home="G:\tomcat_6.0.18\src"
然后点击“ Run ”按钮,我们将会看到 Tomcat 正常启动。恭喜,咱们的 Tomcat 源码已经成功导入 Eclipse ,这时,
9 调试 Tomcat ,
请打开org.apache.jasper.compiler.Compiler 类的源代码,在generateJava() 方法的第一行打一个断点,然后在Eclipse 的调试状态下运行Tomcat ,等Tomcat 运行后,打开我们的浏览器,在地址栏中输入http://localhost:8080/examples/jsp/jsp2/el/basic-comparisons.jsp 并回车,然后我们可观察到Eclipse 此时切换至调试视图:
上面的小实验表明我们可以在Eclipse 中通过Debugger 观察Tomcat 的内部运行机理。另外补充一点,上面的generateJava 方法是将jsp 动态编译至java class ,这个方法只是在第一次请求或者Jsp 源码发生变化时执行,如果您再次在浏览器中发送同样的请求,您将看不到上图的Debug 界面,因为该方法不再执行。
10 其他
JDK 版本引起的问题报如下错误:
[javac] C:\tomcat_6.0.18\src\share\tomcat6-deps\dbcp\src\java\org\apache\tom
cat\dbcp\dbcp\datasources\PerUserPoolDataSource.java:52: org.apache.tomcat.dbcp.
dbcp.datasources.PerUserPoolDataSource 不是抽象的,并且未覆盖 java.sql.Wrapper
中的抽象方法 isWrapperFor(java.lang.Class<?>)
这是JDK 版本1.6 造成的。需要安装JDK 版本1.5.
安装1.5 之后,原来的1.6 不必卸载,
为了把两个版本的JDK 区别开,可以键入如下命令
set path=C:\Program Files\Java\jdk1.5.0_06\bin
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_06
还有一点很有意思。
Tomcat6 以前版本的源代码分散在好几个子项目中,他们分别叫做jakarta-servletapi-5 ,jakarta-tomcat-5 ,jakarta-tomcat-catalina ,jakarta-tomcat-connectors 和jakarta-tomcat-jasper ,我觉得Tomcat 的开发者可能嫌这样做太麻烦了,所以Tomcat6 版本中将这些子项目都合并在一起了。但是,这种做法不利于我们阅读理解源代码。
文章出处: http://www.diybl.com/course/4_webprogram/jsp/jsp_js/2008313/104405_5.html