本文主要记录了在idea下构建tomcat源码环境过程。
1. 获取源码
首先我们要获取tomcat源码,tomcat项目在github上的地址为apache/tomcat,由于众所周知的原因,网速会非常慢,直接checkout,大概率不会成功,我一般的做法是把它导入到gitee仓库中,导入方法很简单,在gitee上创建项目,然后选择导入已有项目就行了:
我导入的tomcat仓库为https://gitee.com/funcy/tomcat.git.
接着我们只需要把gitee仓库的代码checkout下来就行了。
2. 创建分支
导入到idea后,打开项目,项目长这样:
刚checkout下来的代码位于master分支,我比较喜欢基于tag创建新分支,这里我使用的tag是9.0.43,操作命令如下:
# 切换到 9.0.43 的tag
git checkout 9.0.43
# 基于当前分支创建新分支,分支名为 9.0.43.LEARN
git checkout -b 9.0.43.LEARN
# 将 9.0.43.LEARN 推送到远程仓库
git push -u origin 9.0.43.LEARN
当然,你也可以不创建分支,直接在master上开搞。
3. 安装ant
tomcat是基于ant构建的,我们需要先安装ant工具,下载链接ant下载,下载最新版本就对了。
ant 直接下载就 能使用了,不过同maven一样,它也要配置环境变量,关于这个过程就不多说了,我的环境变量配置如下:
export ANT_HOME=/Library/Apache/apache-ant-1.9.15
PATH=$PATH:$ANT_HOME/bin
记住这个ANT_HOME,后面会用到。
配置完成后,运行ant -version命令,结果如下:
$ ant -version
Apache Ant(TM) version 1.9.15 compiled on May 10 2020
如此就表明ant安卓成功了。
4. 配置idea环境
接下来我们就正式开始idea的环境了。
4.1 find action
找到help-action:
在弹出的窗口中,输入ant:
选择第一个,点击,就打了ant的侧边栏
点击“+”,选择tomcat下的build.xml文件:
添加后,ant窗口就这样了:
可以看到,tomcat 的构建类目出现了。点击构建按钮,发现会报错:
没有指定jdk,那就指定下吧:
我们选择jdk 1.8:
设置后的效果如下:
这里有个编译文件的输出目录,我们也要设置下,我设置的是output。
再次编译,还是失败了:
经过一番探索,发现是缺少了配置文件,找到build.properties.default,将其复制为build.properties:
再次编译,没有报错,output目录下也有内容了:
看着好像是编译成功了。
再一看看java代码:
它们并没有被idea识别,解决方法也简单,直接marker as Source Root:
代码正常了,不过也报错了:
刚开始我以为是缓存问题,重启了几次,还是报错,试试command+B编译,报错更多:
看来是缺少了一些jar包了,经过一番探索,发现了项目中配置的ant``jar包存放的默认位置如下:base.path=${user.home}/tomcat-build-libs
这个user.home 就是自己的home目录了,在linux上可以简写为~。
找到对应的目录,发现下面确实有些jar包:
然后我就直接选中,全部添加到项目中:
这样还是不行,发现jar包是要一个一个添加才能生效,那这得加到什么时候。。。
又经过了一番探索,发现在项目的tomcat/res/ide-support/idea/tomcat.iml文件中已经为我们提供了jar的依赖配置方式:
看名称就知道了,tomcat/res/ide-support就是保存来ide的项目文件的,啥都别说了,为了后面不再发生稀奇古怪的问题,直接替换把整个.idea目录给替换了。
替换完成后,重启下idea,然后idea会让你配置下ANT_HOME与TOMCAT_BUILD_LIBS路径:
配置下就行了,ANT_HOME就是上面设置的目录,TOMCAT_BUILD_LIBS就是前面提到的${user.home}/tomcat-build-libs了。
配置完成了,重启下idea,External Libraries显示如图:
包都进来了,再次command+B编译,结果如下:
竟然没有没有junit依赖包!!!
又是一番探索,在build.properties文件中找到了它的版本:
然后我就去maven仓库下载jar包,放到TOMCAT_BUILD_LIBS的目录下:
然后添加进项目,再次编译,又报错了:
搜索下easyMock,在build.properties找到了相关配置:
然后,发现除了easyMock,还有cglib、objenesis等,难道这些也要一个个导入吗?
又经过一番探索,发现可以构建test模块:
等待的时候会有点久,构建时,发现它在下载jar包了:
构建完成,进入TOMCAT_BUILD_LIBS目录,发现多了几个目录,这就是刚刚构建test时下载的:
得到了这些jar包后,要一个个手动添加到idea中吗?贴我如我,已经把tomcat.imi修改好了:
要用到测试用例,直接替换就行了,最终引入的外部jar包如下:
command+B编译,终于不报错了!前面引入的 junit 也可以干掉了。
编译成功后,就可以写我们自己的测试类了。
5. 编写自己的tomcat示例
这个就供大家自行发挥吧,不过在我在idea上运行测试用例有个问题:
控制台输出乱码了!这个后面再研究下怎么处理吧。
6. 总结
本文是tomcat源码编译踩坑记,最后再总结下整个流程:
- 安装
ant构建工具 checkouttomcat源码到idea中,创建自己的分支(也可不必,直接在master上开搞),接下来的操作都是在idea中进行- 在
idea中设置tomcat项目的jdk版本,设置构建输出目录为output - 复制
build.properties.default,将其命名为build.properties - 打开
ant侧边栏,添加tomcat/build.xml文件,然后选中Tomcat 9.0,点击构建按钮,等待构建完成 - 还是
ant侧边栏,选中test,点击构建按钮,等待构建完成 - 将
tomcat/.idea/目录中的内容替换为tomcat/res/ide-support/idea/的内容 - 重启
idea,设置ANT_HOME与TOMCAT_BUILD_LIBS两个目录 - 选中
tomcat/test目录,右键,执行Mark Directory as-Unmark as Test Source Root操作 command+B构建,运行test目录下的测试用例- 接下来就可以编写自己的测试示例了
限于作者个人水平,文中难免有错误之处,欢迎指正!原创不易,商业转载请联系作者获得授权,非商业转载请注明出处。
本文首发于微信公众号 Java技术探秘,如果您喜欢本文,欢迎关注该公众号,让我们一起在技术的世界里探秘吧!