0%

Tomcat启动和源码启动

Tomcat的使用

下载

image-20200820141629483

使用

解压之后,进入BIN目录

1
2
3
4
5
6
7
8
# 启动
打开startup.bat文件

# 停止
打开shutdown.bat文件

# 访问
http://localhost:8000

image-20200820141844196

文件目录结构

目录 目录下文件 说明
bin / 存放Tomcat的启动,停止等批处理脚本文件
startup.bat,
startup.sh
用于win和linux下的启动脚本
shutdown.bat
shutdown.sh
win和linux下的停止脚本
conf / Tomcat的相关配置文件
Catalina 用于存放针对每个虚拟机的Context配置
context.xml 所有web应用均需加载的Context配置,如果改web应用指定了自己的context.xml,改文件被覆盖
catalina.properties Tomcat的环境变量配置
catalina.policy Tomcat运行的安全策略配置
logging.properties 日志配置文件,可以通过改文件修改Tomcat的日志级别以及日记路径等
server.xml 核心配置文件
tomcat-users.xml 定义Tomcat默认的用户和角色映射信息配置
web.xml Tomcat中所有应用默认的部署描述文件,主要定义了基础的Servlet和MIME映射
lib / 依赖包
logs / 默认的日志存放目录
webapps / 默认的web应用部署目录
work / web应用JSP代码生成和编译的临时目录

源码安装运行

下载

image-20200820142736709

安装

1.解压zip压缩包

2.进入解压目录,并创建一个目录,命名为home , 并将conf、webapps目录移入home 目录中

3.创建pom.xml,引入tomcat依赖包

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
67
68
69
70
71
72
73
74
<?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>Tomcat8.5</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>

4.使用IDEA,导入该工程

image-20200820143114385

5.配置启动环境

image-20200820143636964

1
2
3
4
5
6
7
# 下面几个配置中的home,是指刚才创建的home文件夹
-Dcatalina.home=home
-Dcatalina.base=home
-Djava.endorsed.dirs=home/endorsed
-Djava.io.tmpdir=home/temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=home/conf/logging.properties

6.如果编译不通过,就注释掉,本文中的Tomcat源码util.TestCookieFilter类会报错,将其注释即可

7.启动,访问http://localhost:8080

image-20200820143409104

直接启动 org.apache.catalina.startup.Bootstrap的时候没有加载JasperInitializer,从而无法编译JSP。

解决办法是在tomcat的源码org.apache.catalina.startup.ContextConfig中的configureStart函数中手动将JSP解析器初始化:

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
protected synchronized void configureStart() {
// Called from StandardContext.start()

if (log.isDebugEnabled()) {
log.debug(sm.getString("contextConfig.start"));
}

if (log.isDebugEnabled()) {
log.debug(sm.getString("contextConfig.xmlSettings",
context.getName(),
Boolean.valueOf(context.getXmlValidation()),
Boolean.valueOf(context.getXmlNamespaceAware())));
}

webConfig();

// 这一行就是新增加的
context.addServletContainerInitializer(new JasperInitializer(), null);

if (!context.getIgnoreAnnotations()) {
applicationAnnotationsConfig();
}
if (ok) {
validateSecurityRoles();
}

// Configure an authenticator if we need one
if (ok) {
authenticatorConfig();
}

// Dump the contents of this pipeline if requested
if (log.isDebugEnabled()) {
log.debug("Pipeline Configuration:");
Pipeline pipeline = context.getPipeline();
Valve valves[] = null;
if (pipeline != null) {
valves = pipeline.getValves();
}
if (valves != null) {
for (int i = 0; i < valves.length; i++) {
log.debug(" " + valves[i].getClass().getName());
}
}
log.debug("======================");
}

// Make our application available if no problems were encountered
if (ok) {
context.setConfigured(true);
} else {
log.error(sm.getString("contextConfig.unavailable"));
context.setConfigured(false);
}

}

8.再启动,就能看到首页了