一步一步在Eclipse中搭建Tomcat8.0开发环境

写在前面的话

Tomcat是一个很流行的Java EE容器,绝大部分时候我们都只停留在简单的使用它而没有明白真正的实现。为了更方便的看Tomcat的源码,第一步要做的事情就是把Tomcat的源码在Eclipse中跑起来,以下内容就是在Eclipse中搭建Tomcat开发环境的过程。

其实网上已经有不少关于如何搭建Tomcat源码的博客了,但仔细搜索之后可以发现:

  • 文章大部分都是转载的,转载就会有内容不完整或格式错误等问题
  • 原创文章是基于Tomcat6.0,已经是10年前的了,所以有些过时了
  • 网上的搭建过程比较复杂,省略了一些步骤,新手很难上手
  • 原创和转载的文章几乎都是在IntelliJ IDEA中运行,这对于已经习惯了Eclipse的用户来说,只具有参考价值,不具有实战意义

基于以上原因,决定自己动手在Eclipse中搭建一次。

构建环境

  • 操作系统:win10
  • JDK: 1.7.0_67
  • Eclipse: Mars.1 Release (4.5.1)
  • Tomcat: 8.0.46

构建过程

1. 源码下载

http://tomcat.apache.org/download-80.cgi下载源码,我选择的版本为8.0.46,选择zip格式即可:

093704_8aG8_1434710.png

文件大概为7M多,下载好后,解压,可得下图的文件夹结构:

094002_0wKD_1434710.png

2. 建立pom.xml文件

因为源代码使用了部分第三方的jar包,这里我打算用maven来管理这些依赖,所以只需要添加pom.xml文件即可,这样就不会对源代码造成污染(不会向其中增加依赖的jar包)。

用你喜欢的文本编辑器,在源码文件夹apache-tomcat-8.0.46-src中新建一个pom.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>Tomcat8</artifactId>
    <name>Tomcat8.0</name>
    <version>8.0.46</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.9.9</version>
        </dependency>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
        </dependency>
        
        <!-- Below dependencies are for test only -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

代码很明了,首先声明了本次构建的GAV(GroupId,ArtifactId和Version),接下来声明了依赖的第三方jar包。需要注意的是:

  • 网上的博客中,由于是基于Tomcat6.0版本构建,依赖的jar包的版本也比较旧,在本次构建中,已经更改为更高的版本
  • Ant库的GroupId也由之前的ant变成了现在的org.apache.ant,注意区别
  • 最后两个依赖:junit和easymock,是源码中测试代码用到的jar包,如果不想导入测试代码,可以不依赖于这两个jar包

3. 将项目导入Eclipse

有了pom.xml文件以后,接下来将apache-tomcat-8.0.46-src这个文件夹以maven项目的方式导入到Eclipse:

101022_leGo_1434710.png

此时Eclipse会初始化这个项目,并自动下载jar包,第一次需要花费几分钟,请耐心等待。导入完成后,在Eclipse中,Window->Show View->Other->Package Explorer切换到Package Explorer视图,是这样的:

101844_30Tv_1434710.png

如果需要,可以把JDK版本替换为本地已安装的版本。

4. 设置Java源代码路径

apache-tomcat-8.0.46-src这个文件夹结构中,源代码在java文件夹中,测试代码在test文件夹中。此时需要将java文件夹设置为这个项目的Source Folder,让Eclipse知道从这个文件夹下面去找java类。在java文件夹上右键->Build Path->Use as Source Folder,如图:

102418_1MwN_1434710.png

之后就可以看到java源代码包结构了。如果代码显示很多编译错误,像下面这样,可以多打开几个报错的java文件,查看错误原因。:

103334_y2zt_1434710.png

我这里是JDK版本太低了(我也不知道为什么在Eclipse中导入项目后,会自动使用JDK1.5版本来编译,不过好在可以手动修改编译版本),修复办法为:项目上右键->Properties->Java Compiler,如果勾选了Enable project specific settings,那么确保下面的Compiler compliance level是1.7:

104625_I4gP_1434710.png

如果没有勾选Enable project specific settings,则需要确保右边的Configure Workspace Settings弹窗中Compiler compliance level是1.7:

104453_ShKp_1434710.png

之后就没有编译错误了。

5. 设置测试代码路径

这是一个可选的步骤,如果不需要运行测试代码,这一步可以忽略。

Tomcat的单元测试代码放在test文件夹中,如果需要查看,则需要将test文件夹以同样的方式设置为Source Folder:

105853_f4tM_1434710.png

设置好后,报编译错误,说有个CookieFilter的类找不到:

110552_IVc2_1434710.png

仔细观察这个TestCookieFilter类,发现import中没有声明导入这个CookieFilter,于是可以肯定这个类不是第三方的类,它一定在Tomcat的源代码中,换句话说,它一定在Workspace中。所以使用Eclipse的组合键Ctrl+Shift+R并输入文件名,尝试打开Workspace中的Resource:

111036_xtDR_1434710.png

果然有这个类,只是它在webapps/examples/WEB-INF/class文件夹的util包中,打开这个class文件夹,发现下面还有好多Java代码,这些应该都是运行测试需要的。所以我们把这个webapps/examples/WEB-INF/classes也设置为Source Folder,让Eclipse可以去这里查找Java文件:

111636_w44O_1434710.png

这次CookieFilter找到了,刚才的错误消失了,但是又发现一个错误,有个bug类的包路径不对:

112041_kc9Z_1434710.png

一看上方的package声明,该类应该放在org.apache.tomcat路径下,再看看这个类目前的位置,在webapp/WEB-INF/classes/org/apache/tomcat路径下,所以就把webapp/WEB-INF/classes设置为Source Folder:

112331_YxOO_1434710.png
最后,就不报错了。再来看下最后的结果,整个过程中,我们总共把4个文件夹设置成了Source Folder,其中:

  • java文件夹是Tomcat源代码的目录
  • 后面三个文件夹是Tomcat测试代码的目录

112540_taWK_1434710.png

到这里,Eclipse中搭建Tomcat的开发环境就算是完成了。

验证

启动日志验证

接下来,我们找到(可用组合键Ctrl+Shift+O直接打开)Tomcat的启动类org.apache.catalina.startup.Bootstrap,在这个类的main方法的第一行加入一点内容:

113425_YQoW_1434710.png

并且在org.apache.catlina.startup.Catalina类的start方法中加入一点内容:

113837_j9xM_1434710.png

接下来在Bootstrap类上右键->Run as->Java Application,运行Bootstrap类,观察控制台的输出:

114923_ZL3q_1434710.png

以及结尾的日志:

114651_xcQE_1434710.png

从日志上可以看到,Tomcat已经成功启动,并且我们新增的代码也已经输出。

浏览器验证

Tomcat启动好以后,老规矩,在浏览器中输入localhost:8080,再次确认Tomcat是否真的启动了:

从结果中可以看到,Tomcat确实已经正常运行。有了源代码的开发环境,阅读Tomcat源码就方便多了。

总结

1. 对于pom.xml文件,前4个dependency是必不可少的,至于为什么需要这些依赖,代码中哪里用到了这些依赖,可以尝试删除某个<dependency>结构,然后Eclipse重新构建整个项目(Eclipse的菜单上Project->Clean...),看看代码中哪些地方报错了。

2. 其实写这篇文章之前,我也踩过很多坑,比如导入项目之后,由于Eclipse自动创建.project的文件不完整,导致在项目上右键没有出现buildpath,pom.xml中声明的依赖也看不见,后来经过搜索,需要修改.project文件为以下内容(其中第一个<buildCommand>和第一个<nature>是Eclipse没有自动生成的):

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>Tomcat8</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
		<buildCommand>
			<name>org.eclipse.m2e.core.maven2Builder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
		<nature>org.eclipse.m2e.core.maven2Nature</nature>
	</natures>
</projectDescription>

3. 网上的东西不一定都对,还是要亲自测试一下才知道。

  • 比如这篇文章中提到:运行Bootstrap类需要加入一堆的VM参数,但我实测下来并不需要这么做。
  • 再比如这篇文章中在处理CookieFilter类找不到的时候,直接把这个类注释掉了:

报错的类是:TestCookieFilter.java 报里面的CookieFilter.java类不存在,你可以选择注释,也可以选择实现该filter,我是注释掉的。

    但我本着尽量不修改源代码的目标,还是解决了这个办法。

  • 再比如这篇文章,说需要在源代码路径外新建一个study文件夹,并将源代码放于其中,再新建一个pom,并将源代码作为其module。但实际上我没有这么做,也并不需要这么做。

 

全文完。

 

参考页面:

http://www.lxway.com/269821286.htm

http://www.jb51.net/article/95120.htm

http://blog.csdn.net/lucas421634258/article/details/49908323

转载于:https://my.oschina.net/itblog/blog/1528123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值