最近因为需求需要修改Tomcat中的某些功能,无奈只能研究那部分源码然后稍作修改。

目前Tomcat最新版是8.0,下载了源码包,编译并导入Eclipse中研究比较方便。

1. Tomcat8源码编译步骤

1.1 先到Apache Tomcat 8.0官网下载最新版Source Code Distributions,解压到某个目录下,如D:\apache-tomcat-8.0.5-src

1.2 使用ant编译

(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了。

(2)编译Tomcat 8.0

非常简单,cmd进入到刚下载的源码路径下,用下面两个命令即可编译:

ant download
ant

"ant download"命令会下载编译Tomcat所需的依赖包。

这里有两个问题需要注意:

  • 依赖包下载到什么地方?在Linux或MacOX下,会默认下载到 “/usr/share/java”
    目录,当然该目录普通用户是没有权限写的;在Windows下,默认下载到 "某个磁盘:\usr\share\java"
    ,这的磁盘可能是C、D或其它,这一般取决于你把Tomcat源码放在哪个盘了,比如我的放在D盘,默认就下载在
    "D:\usr\share\java" 下。如果我想自己定义下载路径怎么办?
  • 如果用户是通过代理上网的,那么下载过程中就会出错。怎么解决?

熟悉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=
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

2. 将Tomcat源码导入到Eclipse中研究

由于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-.jar
wsdl4j-1.5..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就可以启动了。

Tomcat8源码编译及导入Eclipse中研究的更多相关文章

  1. Hadoop2.5.2源码编译及导入Eclipse

    前言:由于官网提供的64位hadoop是没有编译的,所以当我们用到64位的hadoop时,需要在自己的64位linux系统上编译hadoop源码.另外,要想在eclipse里查看hadoop源码,修改 ...

  2. Hadoop,HBase,Zookeeper源码编译并导入eclipse

    基本理念:尽可能的参考官方英文文档 Hadoop:  http://wiki.apache.org/hadoop/FrontPage HBase:  http://hbase.apache.org/b ...

  3. Tomcat9源码编译及导入Eclipse(转)

    1.下载tomcat源码.建议下载最新版本tomcat9. svn地址:http://svn.apache.org/repos/asf/tomcat/tc9.0.x/branches/gsoc-jas ...

  4. spring-framework源码编译及导入

    环境说明: 时间:2017-09-26 OS name: "mac os x", version: "10.12.4", arch: "x86_64& ...

  5. 琐碎-将hadoop源码作为工程导入eclipse

    之前写过如何用eclipse看hadoop源码,虽然非官方版的,但是可以达到目的,最重要是简单方便快速 官方版(hadoop2.2.0)的也有: 源码目录为: 和之前的源码目录有很大的不同 编译的时候 ...

  6. 将Spring源码转换为工程 + 导入Eclipse时缺失jar包

    将源码转换为工程: 比如查看Spring事务部分的源码. 打开cmd窗口,切换到Spring-tx文件夹下,执行命令 “gradle cleanidea eclipse” . 缺失jar包: 第一步: ...

  7. 将Android源码导入eclipse中的方法以及编译Android源码指定模块

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53365659 将android源码导入eclipse.androidstudio. ...

  8. Tomcat8.0源码编译

    最近打算开始研究一下Tomcat的工作原理,拜读一下源码.所以先从编译源码开始了.尽管网上有那么多的资料,但是总是觉得,自己研究一遍,写一遍,在动手做一遍能够让我们更加深入的了解.现在整个社会都流行着 ...

  9. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

随机推荐

  1. Properties类、序列化流与反序列化流、打印流、commons-IO

    Properties类 特点: 1.Hashtable的子类,map集合中的方法都可以用: 2.该集合没有泛型,键值都是字符串: 3.是一个可以持久化的属性集,键值可以存到集合中,也可存到持久化的设备 ...

  2. 20155326 2016-2017-2《Java程序设计》课程总结

    20155326 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 20155326刘美岑的第一次作业:第一次写博客,写下了对java的期待 20155326 ...

  3. unigui web app之title buttons

    unigui web app之title buttons title buttons:窗体标题按钮 通过 窗体标题按钮,可以方便地导航,比如返回主页. 处理窗体标题按钮的点击事件: procedure ...

  4. Linux Buffer/Cache 的区别

      以前经常使用free -h命令来查看当前操作系统的内存使用情况,同时也注意过返回信息中有一列是buff/cache,来公司之前,面试官还问过我这两个的区别,当时没有回答出来,现在特意回顾记录下: ...

  5. ASP.Net MVC OA项目笔记<三>

    1.1.1 业务层和数据层之间加一个数据会话层,封装所有数据操作类实例的创建(工厂类) 工厂类是负责对象的创建 作用:将BLL和DAL解耦了,提供一个数据访问的统一访问点 数据会话层DBSession ...

  6. 过滤器中获取form表单或url请求数据

    var httpFormData = filterContext.HttpContext.Request.Form; var logContent = string.Empty; //获取url的 l ...

  7. Entity Framework Core 生成跟踪列-阴影属性

    摘自:https://www.cnblogs.com/tdfblog/p/entity-framework-core-generate-tracking-columns.html Ef Core 官方 ...

  8. Android------TabLayout的使用

    https://www.jianshu.com/p/2b2bb6be83a8 主要放在 -------> Design库中的TabLayout的使用. margin和padding的区别 外边距 ...

  9. BZOJ 5194--[Usaco2018 Feb]Snow Boots(STL)

    5194: [Usaco2018 Feb]Snow Boots Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 81  Solved: 61[Submi ...

  10. Java 泛型通配符

    package com.waston; import java.util.*; public class Main { public static void main(String[] args) { ...