原创

tomcat 源码分析 导入eclipse 或 idea 运行

1、下载tomcat源码。建议下载最新版本tomcat9。

      svn地址:http://svn.apache.org/repos/asf/tomcat/tc9.0.x/branches/gsoc-jaspic

2、由于tomcat采用ant编译。故需下载ant。如果已经下载此工具,则直接跳过。

    ant下载地址:http://ant.apache.org/bindownload.cgi 

3、环境变量设置。把ant的安装目录添加到path里。 

4、进入到tomcat的源码目录。我的本地目录就是:D:\kaifa\tomcat9。

执行 :

  1. ant ide-eclipse  
准备好好研究学习一下tomcat 7 的源代码,那么第一步就是下载,导入eclipse并且运行。 
1. 下载源代码 
tomcat 7 的源代码在svn上,所以你需要svn的安装。创建一个目录tomcat7,并用命令行进入这个目录,之后用下面的命令下载 
Java代码  收藏代码
  1. svn co http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_27/ ./  

这里我下载的是tag里面的,你也可以下载别的branch,比如trunk,但是我觉得tag的是比较稳定的。 

2. 创建eclipse项目 
tomcat 7 是用ant来构建和管理的,所以你需要安装ant。在tomcat7目录下执行: 
Java代码  收藏代码
  1. ant ide-eclipse  


其实,你看一下build.xml就知道它就是copy了两个现成的文件 

Java代码  收藏代码
  1. <target name="ide-eclipse" depends="deploy, extras-webservices-prepare"  
  2.           description="Prepares the source tree to be built in Eclipse">  
  3.   
  4.     <!-- Copy the sample project files into the root directory -->  
  5.     <copy file="${tomcat.home}/res/ide-support/eclipse/eclipse.project" tofile="${tomcat.home}/.project"/>  
  6.     <copy file="${tomcat.home}/res/ide-support/eclipse/eclipse.classpath" tofile="${tomcat.home}/.classpath"/>  
  7.   
  8.     <echo>Eclipse project files created.  
  9. Read the Building page on the Apache Tomcat documentation site for details on how to configure your Eclipse workplace.</echo>  
  10.   </target>  


这样你就可以在eclipse里面导入这个tomcat 项目了 
3. 在eclipse里面添加lib变量 
导入项目以后你会发现有几个错误导致不能编译,其实是缺少lib变量: 
ANT_HOME, 指向ant的安装目录 
TOMCAT_LIBS_BASE,指向依赖库的位置,如果你还没有在tomcat7下执行: 
Java代码  收藏代码
  1. ant  

来build和deploy这个项目,就先执行它。 
这样它就会下载需要的lib。  

如果你不确定放到哪里了,你可以搜索ecj-3.7.2,把它的上级目录指定给这个变量就好了。 
添加好之后,eclipse会提示你重新build项目,当然要。之后就会没有错误了。 

4. 运行 
右击这个tomcat-7.0.x项目,选择run as / Java Application,它会自动搜索项目中的所有main函数,你选择org.apache.catalina.startup.Bootstrap的main函数就是。 选择好了之后,你也许会看到有tomcat-start和tomcat-stop两个启动项让你选择,其实这个是tomcat为你准备好的launch文件,在tomcat7\res\ide-support\eclipse下面有两个launch文件。也就是说你直接可以在run configuration里面找到这两个启动配置,从而加以利用。在run configuration的配置里面的Common tab里面你还可以设置选中debug,从而你可以在debug菜单下显示它了。 
问题:为什么这个函数的注释写仅仅为了测试: 

Java代码  收藏代码
  1. /** 
  2.     * Main method, used for testing only. 
  3.     * 
  4.     * @param args Command line arguments to be processed 
  5.     */  
  6.    public static void main(String args[]) {  


5. 启动好以后你可以打开下面的网址: 

Java代码  收藏代码
  1. http://localhost:8080/  



你会看到欢迎页面,大功告成!你可以在main里面设置断点debug了。 

6. 配置更为详细的log
 
看更为详细的log有利于我们准确地跟踪tomcat的执行过程。tomcat的日志框架允许我们配置第三方的log系统实现,比如log4j。默认情况下它使用java.util.logging. 
需要两步来实现更为详细的log的配置 
1)运行参数,加上 

Java代码  收藏代码
  1. -Djava.util.logging.config.file=${project_loc:/tomcat-7.0.x}/conf/logging.properties  


2)修改log level的配置,把FINE,改成FINEST。并加入: 

Java代码  收藏代码
  1. org.apache.catalina.level = FINEST  

一、安装ant

到官方主页http://ant.apache.org下载新版(目前为Ant1.8.1)的ant,得到的是一个apache-ant-1.8.1-bin.zip的压缩包。将其解压到你的硬盘上,例如:C:\apache-ant-1.8.1。

二、配置环境变量

window中设置ant环境变量:

ANT_HOME    C:/ apache-ant-1.8.1

path             C:/ apache-ant-1.8.1/bin

classpath      C:/apache-ant-1.8.1/lib

注意:【
  配置环境变量:我的电脑----属性-----高级----环境变量
      如:ANT_HOME:C:\apache-ant-1.8.1
      PATH:%ANT_HOME%\bin (为了方便在dos环境下操作)
     实验了总是失败,没办法换成地址 C:/ apache-ant-1.8.1/bin,而不再使用变量。。。成功了。。

三、验证ant

为了验证ant是否成功安装,可以进行如下操作:

依次选择:开始->运行->cmd,输入如下命令:ant

如果出现如下内容,说明安装成功:

Buildfile: build.xml does not exist!

Build failed

【说明ant安装成功!因为ant默认运行build.xml文件,这个文件需要我们建立。】

查看版本:ant  -version


但如果出现如下内容,说明安装失败:(可以重复前述步骤,直至安装成功。)

'ant' 不是内部或外部命令,也不是可运行的程序或批处理文件。

 

从别处移动过来的:

使用:
(1)在D盘根目录下建立build.xml

1<?xml version="1.0" encoding="GBK"?>
2<project name="测试脚本" default="copyfile" basedir="." >
3   <target name="copyfile">
4      <copy file="d:/a.txt" todir="e:/Temp" overwrite="true" />
5   </target>
6</project>


(2)在D盘根目录下建立文件a.txt。
(3)进入dos,
         d:
         ant
         
         此时可在E:/Temp目录下见到文件aa.txt,内容与a.txt一样,即拷贝成功!

idea 方式 没成功 大家可以试一下

一、环境

以下是我编译Tomcat所采用的环境

  • OS X Yosemite Version 10.10.5
  • Intellij IDEA 2017.1
  • Java version 1.8.0_65
  • Apache Maven 3.3.9
  • Tomcat 9.0.0.M21

(1)JDK1.8

Tomcat9至少需要jdk1.8版本,网上有很多java安装的教程。

(2)Tomcat源码

访问Tomcat下载地址,最底部的tar包或zip包源码

(3)Maven3.0+

Tomcat默认是采用ant来编译的,若你想用官方的方法编译tomcat,可访问官网how to build tomcat。笔者之前一直用maven作为管理工具,所以上网找了些资料,自己整理了用maven编译tomcat的方法。

二、准备pom.xml文件

解压tomcat源码到/yourpath/tomcat9,如下图


 

/yourpath/tomcat9目录下添加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>cn.linxdcn</groupId>
    <artifactId>Tomcat9.0</artifactId>
    <name>Tomcat9</name>
    <version>9.0</version>

    <build>
        <finalName>Tomcat9</finalName>
        <sourceDirectory>java</sourceDirectory>
        <resources>
            <resource>
                <directory>java</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.9.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-apache-log4j</artifactId>
            <version>1.9.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-commons-logging</artifactId>
            <version>1.9.5</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.rpc</groupId>
            <artifactId>javax.xml.rpc-api</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.4</version>
        </dependency>
    </dependencies>
</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

三、导入Intellij IDEA

(1)导入maven工程

打开Intellij IDEA,选择Import Project,在弹出框中选择/yourpath/tomcat9/pom.xml,一直next直到finish

(2)修改JDK版本

菜单栏file->Project Strucuture->Project->Project SDK,确实是否为JDK 1.8


 

(3)设置启动项

菜单栏run->Edit Configurations,左上角的+号,然后选择Application

  • Name:可随意起,如tomcat_9_run
  • Main Class:选择org.apache.catalina.startup.Bootstrap
  • VM options:填写-Dcatalina.home="/yourpath/tomcat9"


 

(4)删除webapps内容

/yourpath/tomcat9/webapps文件夹下的内容情况,新建一个demo文件夹,以及在demo文件夹下新建index.html文件,如下,作为测试例子

<p>Hello! This is my tomcat 9</p>
  • 1

ps:这里解释下为什么把webapps里的内容全部删除掉,因为我用maven构建有一些类的依赖还没解决,所以tomcat自带的例子一些配置类加载不了,后面会导致出错。作为学习这影响不大,后续有空再解决这个问题。

四、更改源代码

Tomcat9中有部分代码使用CompilerOptions.VERSION_1_9来判断java虚拟机版本,里面涉及1.9版本的jvm,我机器上识别不了。

java/org/apache/jasper/compiler/JDTCompiler.java类中把上述代码找出,删除即可,总共有3处。

五、编译

在Intellij IDEA中,右边Maven Project->Lifecycle->compile进行编译。

看见如下输出信息,即表示编译成功。

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Tomcat9 9.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Tomcat9.0 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1851 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3:compile (default-compile) @ Tomcat9.0 ---
[INFO] Compiling 1589 source files to /Users/linxiaodong/LXD/source-code-analysis/tomcat9/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 17.299 s
[INFO] Finished at: 2017-05-30T22:02:39+08:00
[INFO] Final Memory: 24M/666M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

六、运行

在Intellij IDEA中运行Tomat程序,在浏览器中输入

localhost:8080/demo
  • 1
  • 2

即可看见你新建的index.html网页。

正文到此结束
Loading...