Tomcat目录结构学习

2026-02-17 23:57:55

Tomcat

基本信息暂时不作过多介绍了,本文聚焦于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

Tomcat

├── bin

│ ├── bootstrap.jar

│ ├── catalina-tasks.xml

│ ├── catalina.bat

│ ├── service.bat

│ ├── shutdown.bat

│ ├── startup.bat

│ ├── tomcat11.exe

│ ├── tomcat11w.exe

│ ├── version.sh

| ├── .........

|

├── conf # 用来存放tomcat的一些配置文件

| ├── Catalina # Catalina 为一个目录,可以设置默认加载的项目,初始状态下可能不存在

│ ├── catalina.properties

│ ├── context.xml # context.xml 可以用来配置数据源之类的

│ ├── logging.properties

│ ├── server.xml # server.xml 可以设置端口号、设置域名或IP、默认加载的项目、请求编码

│ ├── tomcat-users.xml # tomcat-users.xml 用来配置管理tomcat的用户与权限

│ ├── tomcat-users.xsd

│ └── web.xml # web.xml 可以设置tomcat支持的文件类型

├── lib # lib目录主要用来存放tomcat运行需要加载的jar包,建议只把Tomcat需要的jar包放到这个目录下

│ # 例如,像连接数据库的jdbc的包(mysql-connector-java-8.0.16.jar)我们可以加入到lib目录中来

│ ├── annotations-api.jar

│ ├── catalina-storeconfig.jar

│ ├── tomcat-i18n-es.jar

│ ├── .......

|

├── logs # 顾名思义,一些日志的保存点

|

├── src # 并非自带,笔者同时下载了源码zip包,自行创建的目录,放入了源码

│ └── apache-tomcat-11.0.0-src.zip

|

├── temp # temp目录用户存放tomcat在运行过程中产生的临时文件。(清空不会对tomcat运行带来影响)

│ └── safeToDelete.tmp

|

├── webapps

│ ├── ROOT

│ ├── ........ # 稍后重点介绍

├── work # work 目录用来存放tomcat在运行时的编译后文件,例如运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!

| # 可以把这个目录下的内容删除,再次运行时会生再次生成work目录。

| # 当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件

| # 生成的java和class文件都会存放到这个目录下。

| # 清空work目录,然后重启tomcat,可以达到清除缓存的作用。

| # 可以把这个目录下的内容删除,再次运行时会生再次生成work目录

|

├── LICENSE # 许可证

└── NOTICE # 说明文件

其他没有列出的根目录下的普通文件不重要

Webapps

Tomcat的目录结构中,最值得关注的目录这个是发布和访问目录

webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。

可以以文件夹、war包、jar包的形式发布应用。

也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行,如下

其中又分为ROOT目录和其他目录

ROOT

默认情况下,没有访问路径的请求,会被映射到ROOT目录中

举例:如果访问http://localhost:8080/的话,就回去查找ROOT目录

证明:

12133.txt内容如下

这时候,如果访问http://127.0.0.1:8080/12133.txt,结果如下

App目录

其他目录一般遵循一个标准结构,我们统称这种目录为App目录

下图中的前4个目录都可以称为App目录

例如:访问http://127.0.0.1:8080/examples/,那么默认访问的是http://127.0.0.1:8080/examples/index.html

效果如下

index.html内容如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Apache Tomcat Examples

Apache Tomcat Examples

完全对应了

App目录标准结构

Tomcat 自带的 App目录的目录内容如下

1

2

3

4

5

6

7

examples/

├── META-INF

├── WEB-INF

├── index.html

├── jsp

├── servlets

└── websocket

其中,WEB-INF是必要的重要目录,且必须是这个名字!

WEB-INF

WEB-INF 一般是受保护的资源目录,浏览器通过url不可以直接访问的目录

/WEB-INF/web.xml

Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。

必要文件,web项目的基本配置文件。(较新的版本中可以没有该文件,但是学习过程中还是需要该文件)

/WEB-INF/classes/

包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中。

web项目中如果没有源码,则该目录不会出现

/WEB-INF/lib/

存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。

web项目要是没有依赖任何jar,则该目录不会出现

/WEB-INF/src/

源码目录,按照包名结构放置各个 Java 文件。

/WEB-INF/database.properties

数据库配置文件

/WEB-INF/tags/

存放了自定义标签文件

该目录并不一定为 tags,可以根据自己的喜好和习惯为自己的标签文件库命名,当使用自定义的标签文件库名称时,在使用标签文件时就必须声明正确的标签文件库路径。例如:当自定义标签文件库名称为 simpleTags 时,在使用 simpleTags 目录下的标签文件时,就必须在 jsp 文件头声明为:<%@ taglibprefix="tags" tagdir="/WEB-INF/simpleTags" % >

/WEB-INF/jsp/

jsp 文件的存放位置。改目录没有特定的声明,同样,可以根据自己的喜好与习惯来命名。此目录主要存放的是 jsp 1.2 以下版本的文件,为区分 jsp 2.0 文件,通常使用 jsp 命名,当然你也可以命名为 jspOldEdition 。

META-INF

jar文件

开发中可以直接使用java class文件来运行程序,不过这样不太方便,所以出现了jar文件来提供发布和运行,jar文件实际上是class文件的zip压缩存档,有很多工具都可以操纵这种格式的文件,

但是jar文件本身并不能表达应用程序的便签信息,于是出现了META-INF目录

jar文件中有一个特定的目录来存放标签信息:META-INF目录

为了提供存档的便签信息,出现了META-INF/Manifest.mf文件,它包含了jar文件的内容描述,在应用程序运行时向JVM提供应用程序的信息。

jar文件都有一个默认产生的META-INF目录和其中的manifest.mf文件

使用jar命令可以直接产生META-INF目录和manifest.mf文件

Manifest.mf文件示例:

1

2

3

4

Manifest-Version: 1.0

Created-By: IntelliJ IDEA

Built-By: Dan

Build-Jdk: Oracle OpenJDK 17.0.11

解析

1

2

3

4

5

6

7

Manifest-Version:生成的manifest.mf文件的版本

Created-By:文件的生成者,一般由jar命令行工具生成,这里显示的是:IDEA

Built-By:文件的创建用户命名,在IDEA的配置文件中可以设置

Bulid-Jdk:所使用的JDK环境

其实manifest.mf文件中的配置信息除了上面的四个之外,还是有很多的,以下是几个常见的属性:

一般属性

Signature-Vresion:定义jar文件的签名版本

Class-Path:内部的类搜索路径,提供给应用程序或者类装载器

应用程序的相关属性

Main-Class:定义jar文件的入口类,该类必须可执行!一旦定义了该属性就可以使用java -jar 程序名.jar来运行该jar文件

Manifest.mf文件格式要求

manifest文件中的每一行都是 key-value 对应的;

属性名开头,接着是 “:” ,然后是属性值;

每行最多72个字符,如果需要增加,可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。

其他位置文件映射

找到conf/server.xml文件中的 host 标签,在 host 标签内定义子标签Context

Context标签必须定义 docBase(实际文件所在文件夹路径:例F:\test)属性,path(访问虚拟路径:例/files)属性

举例

1

2

3

4

5

6

unpackWARs="true" autoDeploy="true">

# 下列是重点

.....

配置好后,访问路径 localhost:8080/files/css.txt 即可访问到实际路径 F:\test\css.txt 文件

conf\Catalina

这个目录由上可知,这个目录的配置有关于默认加载的项目

而大名鼎鼎的IDEA,即是通过控制conf\Catalina\localhost下的*.xml文件,来映射设置Tomcat与项目output目录之间的关系

上图可以看到,内容其实与conf/server.xml中的配置内容无二,只是这个无需考虑放入到指定位置

补充:

xml 文件内容含义如下:

path 表示工程的访问路径:/jndidemo_war_exploded

docBase 表示实际的工程目录在哪里,也就是我们需要访问jndidemo_war_exploded文件夹在我们主机上的全路径

注意:这个地方path的参数即/jndidemo_war_exploded要与配置文件名称相一致,可以看到配置文件为jndidemo_war_exploded.xml,其文件名称与path的参数即/jndidemo_war_exploded相一致

Ref

https://blog.csdn.net/m0_68988603/article/details/124285667

https://blog.csdn.net/Helen_1997_1997/article/details/131935349

https://blog.csdn.net/u011479200/article/details/108244382

https://blog.csdn.net/qq_38449518/article/details/82414069

https://blog.csdn.net/MrYushiwen/article/details/113383917