作为一个优秀的程序开发者,我们不仅需要对自己编写的程序有深刻的理解和认识,同样的我们还需要对我们编写的程序的运行环境有一个彻底的认识,这样我们在能在这条路上走的更远。相信大家对tomcat都很熟悉,目前也是大陆使用的较多的一种开源的Web容器。对于Tomcat的基本使用这里不做过多的介绍。具体的下载和使用可以查看我在2018年写的https://blog.csdn.net/qq_38701478/article/details/85003063这篇文章。
好了我们进入今天的主题,首先准备好源码,这里使用的版本是tomcat8.5-42
首先我们来打开Idea 创建一个空的工程
点击完成,然后我们将下载好的源码包解压,放到上面刚刚创建的空工程对应的文件夹下
然后我们需要进行两个操作,首先创建一个home目录,接着将conf文件夹和webapps文件夹拷贝到home目录中(其他的不需要)
好了,接着我们在源码的目录下创建一个pom.xml的文件,因为我们要以Maven工程的模式来构建源码,pom文件中主要的内容就是tomcat 依赖的jar包,对应于lib目录下的那些。具体的内容如下:
<?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>org.apache.tomcat</groupId>
<artifactId>apache-tomcat-8.5.42-src</artifactId>
<name>Tomcat8.5</name>
<version>8.5</version>
<build>
<finalName>Tomcat8.5</finalName>
<sourceDirectory>java</sourceDirectory>
<!-- <testSourceDirectory>test</testSourceDirectory>-->
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<!-- <testResources>
<testResource>
<directory>test</directory>
</testResource>
</testResources>-->
<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>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
</project>
接着我们回到Idea中,我们在项目中new一个module ,选择这从已经存在的项目中创建。
选中pom.xml文件即可。等待项目加载完成,(在此之前请见检查自己的maven环境是否正常)
导入成功之后项目结构如下:
好了,我们先来看一下,tomcat 的项目架构,我们都知道,一个Java项目的入口都是一个main方法,我们想要自己运行这个工程就要找到他的程序入口Main方法,首先我们都很熟悉,我们在启动tomcat的时候都是使用的startup.sh或者是startup.bat这两个简本,这两个脚本一个是Linux下的一个是Windows平台下的,首先我们先来看一下startup.bat这个。
我们发现 这个批处理文件中实际上调用的是catalina.bat,好吧,我们打开catalina.bat这个文件看看,虽然我们可能看不懂windows下面的批处理脚本,但是我们可以挑一些我们熟悉的东西看,大家仔细看的话,会发现一个叫做MAINCLASS的变量,如下图所示:
从字面上来理解,这个应该就是我们要找的著启动类了,也就是说Main 方法就是在该类中,好了,我们接着打开BootStrap这个类,
我们看一下,发现里面确实有一个main方法,
好了,主启动类找到了,接下来我们需要配置一下运行时的参数,我们选择添加一个Application
-Dcatalina.home=D:/projec/java/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home
-Dcatalina.base=D:/projec/java/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:/projec/java/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home/conf/logging.properties
好了,我们启动刚刚配置的BootStrap这个Application即可
点击debug ,就可以启动项目了,首次启动的过程可能有点漫长
我们发现8080端口成功的启动了,打开浏览器,我们发现可以正常的访问主页
如果发现访问的时候报错了,可以在ContextConfig中的configureStart函数中手动将JSP解析器初始 在770行webConfig();方法后加上context.addServletContainerInitializer(new JasperInitializer(), null); 即可。
好了,我们到这里我们已经成功的构建了tomcat8.5版本的源码了,并且已经可以在本地运行了。下面我们就来看看Tomcat到底是怎么发布我们部署的项目