本文主要记录了在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
的项目文件的,啥都别说了,直接替换把tomcat.iml
替换了。
替换完成后,重启下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
包下的代码,然后就做了一个明智的决定:
直接把test
目录的标记给去掉,这样idea就不会去编译这个目录下的代码了。
command+B
编译,终于不报错了!前面引入的 junit
也可以干掉了。
编译成功后,就可以写我们自己的测试类了。
5. 编写自己的tomcat示例
待续...
6. 总结
本文是tomcat源码编译踩坑记,最后再总结下整个流程:
- 安装
ant
构建工具 checkout
tomcat
源码到idea中,创建自己的分支(也可不必,直接在master
上开搞),接下来的操作都是在idea中进行- 在
idea
中设置tomcat
项目的jdk
版本,设置构建输出目录为output
- 复制
build.properties.default
,将其命名为build.properties
- 打开
ant
侧边栏,添加tomcat/build.xml
文件,点击构建
按钮,构建成功 - 将
tomcat/.idea/tomact.iml
替换为tomcat/res/ide-support/idea/tomcat.iml
- 重启
idea
,设置ANT_HOME
与TOMCAT_BUILD_LIBS
两个目录 - 选中
tomcat/test
目录,右键,执行Mark Directory as
-Unmark as Test Source Root
操作 command+B
构建,构建成功- 接下来就可以编写自己的测试示例了