最近由于需求须要修改Tomcat中的某些功能,无奈只能研究那部分源码而后稍做修改。java
目前Tomcat最新版是8.0,下载了源码包,编译并导入Eclipse中研究比较方便。
web
1.1 先到Apache Tomcat 8.0官网下载最新版Source Code Distributions,解压到某个目录下,如D:\apache-tomcat-8.0.5-srcapache
1.2 使用ant编译tomcat
(1)安装ant
服务器
若是机器上已经安装了ant能够省略这一步,不然去ant官网下 载最新版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了。dom
(2)编译Tomcat 8.0eclipse
很是简单,cmd进入到刚下载的源码路径下,用下面两个命令便可编译:jsp
ant download
ant
"ant download"命令会下载编译Tomcat所需的依赖包。maven
这里有两个问题须要注意:
测试
熟悉ant的人应该知道怎么解决,就是经过配置文件build.properties来 设置。该配置文件在Tomcat源码路径下为 “build.properties.default” ,咱们能够去掉.default后缀或直接新建一个build.properties均可以,固然我选择了前者,将 “build.properties.default” 修改成 “build.properties” 打开, 修改里面的base.path属性值为咱们但愿的下载路径并添加proxy代理配置,格式以下:
# ----- Proxy setup ----- # Uncomment if using a proxy server proxy.host=proxy.domain proxy.port=8080 proxy.use=on # ----- Default Base Path for Dependent Packages ----- # Replace this path with the directory path where dependencies binaries # should be downloaded base.path=/home/me/some-place-to-download-to
根据本身的须要进行设置,注意若是不须要某项设置须要用#注释掉。
依赖包下载成功后(若是下载失败能够多试几回),执行ant便可编译,编译成功后当前路径下回多出个output文件夹,就是咱们的编译结果。
附:
①若是你修改了部分源码,须要从新编译 ,直接进入到源码路径,执行ant命令便可。
②若是须要编译servlet和jsp API文档,进入到源码路径下执行以下命令:
ant -f dist.xml dist-javadoc
③若是须要编译extras扩展功能(commons-logging, webservices etc.),进入到源码路径下执行以下命令:
ant -f extras.xml
④若是须要编译成release版本,进入到源码路径下执行以下命令:
ant -f dist.xml release
因为Tomcat不是Eclipse管理的项目,所以不能直接导入,须要新建一个Java项目,好比为Tomcat8,这时有两种方法就源码导入进来。
第一种:将所须要的源码包java和test(Junit测试用例,可选)两个文件夹直接拷贝到src下。
第二种:选择File - > import -> File System,在From directory中选择tomcat源码包中的java和test两个文件夹,在Into folder中选择咱们刚新建的Tomcat8项目,Finish,而后记得将这两个文件夹标记为source code(怎么标记?右键选择者文件夹 -> Build Path -> Use as Source Folder)。
固然这样事后就不是完事了,这时会发现整个项目不少红叉,也就是缺乏依赖包,在Build Path里加上下面的几个依赖包便可:
Java包须要下面四个jar包,注意版本可能不同:
ant.jar jaxrpc.jar org.eclipse.jdt.core_3.8.3.v20130121-145325.jar wsdl4j-1.5.1.jar
test包里须要junit.jar,直接“Add Libraries...”选择Junit便可:
junit.jar
固然也能够在Eclipse中启动Tomcat,方法以下:
找到类:org.apache.catalina.startup.Bootstrap.java,从名字上也能够看出是启动类,若是你此时直接运行该类,会报以下错误:
Apr 02, 2014 3:27:38 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [D:\workspace\Tomcat8\lib], exists: [false], isDirectory: [false], canRead: [false] Apr 02, 2014 3:27:38 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [D:\workspace\Tomcat8\lib], exists: [false], isDirectory: [false], canRead: [false] Apr 02, 2014 3:27:40 PM org.apache.catalina.startup.Catalina load WARNING: Can't load server.xml from D:\workspace\Tomcat8\conf\server.xml Apr 02, 2014 3:27:40 PM org.apache.catalina.startup.Catalina load WARNING: Can't load server.xml from D:\workspace\Tomcat8\conf\server.xml Apr 02, 2014 3:27:40 PM org.apache.catalina.startup.Catalina start SEVERE: Cannot start server. Server instance is not configured.
说没有配置服务器实例,从警告语句能够知道缘由:当前项目路径下没有lib和conf这两个文件夹,从而找不到服务器配置文件server.xml,固然也就不能实例化服务器了。
解决方法有两个:
①将这两个文件夹直接拷贝到项目工程下
那么这两个文件夹在哪?去Tomcat源码路径里咱们能够看到只有conf配置文件夹没有lib文件夹,其实这也是我编译Tomcat的缘由:lib在编译后的output文件夹中的build文件夹里,conf这里也有。固然你也能够直接从官网下载二进制包,里面是编译好的Tomcat,根路径就有这两个文件夹。将build下面的conf和lib文件夹直接拷贝到项目里,再次运行,启动成功。
Apr 02, 2014 3:37:58 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Program Files\TortoiseGit\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;D:\Program Files\Gow\bin;D:\Program Files\Visual Leak Detector\bin\Win32;D:\Program Files\Visual Leak Detector\bin\Win64;D:\Program Files\Java\jdk1.7.0_51\\bin;D:\Program Files\apache-maven-3.2.1\bin;D:\Program Files\Git\cmd;.
Apr 02, 2014 3:38:00 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Apr 02, 2014 3:38:00 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2254 ms
Apr 02, 2014 3:38:00 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Apr 02, 2014 3:38:00 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/@VERSION@
Apr 02, 2014 3:38:00 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Apr 02, 2014 3:38:00 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Apr 02, 2014 3:38:00 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/29 config=null
Apr 02, 2014 3:38:00 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 386 ms
②添加VM虚拟机运行参数
第二种方法就是添加VM参数,指定这两个文件夹的具体路径,用VM的-D参数指定catalina.home属性值为具体的路径,具体方法以下:
Run as -> Run Configuration... - > Arguments -> VM arguments中设置:
-Dcatalina.home="D:/apache-tomcat-8.0.5-src/output/build"
而后Run就能够启动了。