在 Tomcat 中部署 Web 应用主要有两种形式:部署 WAR 包 和 部署解压后的目录。下面我将详细解释它们的配置方式。
核心概念
- WAR 包 :一个标准的 Java Web 应用程序压缩包,遵循特定的目录结构。Tomcat 在启动或运行时检测到 WAR 包后,会自动将其解压到同名目录中,然后加载运行。
- 部署目录 :就是 WAR 包解压后的完整目录结构(包含
WEB-INF
,META-INF
等)。Tomcat 可以直接加载这个目录来运行应用。
部署位置
无论哪种方式,应用的放置位置(我们称之为"部署位置")主要有以下三个:
-
$CATALINA_BASE/webapps/
目录- 这是 Tomcat 默认的、自动部署的目录。你只需将 WAR 包或应用目录放到这里,Tomcat 就会自动处理(默认配置下)。
$CATALINA_BASE
通常就是你的 Tomcat 安装目录。
-
$CATALINA_BASE/conf/Catalina/[hostname]/
目录- 这是通过XML上下文配置文件进行部署的位置,可以实现更精细的控制。
-
服务器上的任意位置
- 通过XML上下文配置文件 指定一个绝对路径,可以将应用部署在
webapps
之外的任何地方。
- 通过XML上下文配置文件 指定一个绝对路径,可以将应用部署在
方式一:部署 WAR 包
1. 自动部署 (Hot Deployment)
这是最简单、最常见的方式。
- 步骤 :直接将你的
your-application.war
文件复制到$CATALINA_BASE/webapps/
目录下。 - 原理 :
- 如果 Tomcat 正在运行,它会通过"部署器"组件监听
webapps
目录的变化,自动解压 WAR 包(生成your-application/
目录)并加载应用。 - 如果 Tomcat 未启动,它会在启动时自动解压并加载
webapps
目录下的所有 WAR 包。
- 如果 Tomcat 正在运行,它会通过"部署器"组件监听
- 访问路径 :应用的上下文路径(Context Path)通常由 WAR 包的文件名决定。例如,
myapp.war
对应的访问路径是http://localhost:8080/myapp
。 - 优点 :极其简单,无需重启(取决于
autoDeploy
配置),适合开发和测试环境。
2. 修改 WAR 包名称以改变上下文路径
如果你想改变访问路径,可以直接重命名 WAR 包。
- 步骤 :将
myapp.war
重命名为ROOT.war
再放入webapps/
。 - 结果 :应用将成为根应用,访问路径为
http://localhost:8080/
。 - 注意 :删除
webapps/ROOT
目录(如果存在)以避免冲突。
3. 使用上下文配置文件 (Context XML File)
这种方式不依赖 webapps
目录,可以实现更灵活的管理。
-
步骤 :
-
将你的
your-application.war
文件放在一个任意位置,例如/opt/applications/myapp.war
。 -
在
$CATALINA_BASE/conf/Catalina/localhost/
目录下(localhost
是你的主机名),创建一个 XML 配置文件,例如myapp.xml
(这个文件名决定了最终的上下文路径)。 -
在该配置文件中指定 WAR 包的路径:
xml<!-- 文件内容:$CATALINA_BASE/conf/Catalina/localhost/myapp.xml --> <Context docBase="/opt/applications/myapp.war" />
-
-
原理 :Tomcat 会读取这个 XML 文件,并根据
docBase
属性找到 WAR 包进行部署。 -
访问路径 :由 XML 文件的文件名 决定。例如,上面的
myapp.xml
对应的访问路径就是http://localhost:8080/myapp
。 -
优点:WAR 包可以存放在任何地方;上下文路径与 WAR 包文件名解耦;可以方便地添加额外配置(如 JNDI 数据源)。
方式二:部署解压后的目录
1. 自动部署 (Hot Deployment)
与 WAR 包方式类似,只是放置的是目录。
- 步骤 :直接将你的解压后的应用程序目录(例如
myapp/
,里面包含WEB-INF/
)复制到$CATALINA_BASE/webapps/
目录下。 - 原理:Tomcat 会直接检测并加载这个目录。
- 访问路径 :由目录名决定。例如,
myapp/
目录的访问路径是http://localhost:8080/myapp
。 - 优点 :修改静态文件(如 HTML, JS, CSS)或某些配置后,有时无需重新打包,Tomcat 可能会自动重新加载(取决于配置),方便调试。
2. 作为根目录部署
- 步骤 :将你的应用目录重命名为
ROOT
,然后放入webapps/
目录。 - 结果 :应用将成为根应用,访问路径为
http://localhost:8080/
。
3. 使用上下文配置文件 (Context XML File)
这是部署解压目录最强大和灵活的方式。
- 步骤 :
-
将你的应用目录放在一个任意位置,例如
/opt/applications/myapp-dir/
。 -
在
$CATALINA_BASE/conf/Catalina/localhost/
目录下创建一个 XML 配置文件,例如myapp.xml
。 -
在该配置文件中指定应用目录的绝对路径:
xml<!-- 文件内容:$CATALINA_BASE/conf/Catalina/localhost/myapp.xml --> <Context docBase="/opt/applications/myapp-dir" />
你也可以在配置文件中添加
reloadable="true"
属性,让 Tomcat 在检测到WEB-INF/classes
或WEB-INF/lib
变化时自动重新加载应用,这在开发时非常有用,但生产环境不建议使用,因为会有性能开销。
-
- 访问路径:同样由 XML 文件的文件名决定。
- 优点 :
- 应用目录可以存放在任何地方。
- 与 Tomcat 安装目录完全分离,便于管理、备份和升级 Tomcat。
- 可以为一个应用创建多个不同配置的上下文文件(例如,测试和生产配置)。
配置方式总结对比
部署方式 | 操作步骤 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
WAR - 自动部署 | 复制 WAR 到 webapps/ |
极其简单 | 路径受文件名限制;文件混在 Tomcat 目录中 | 开发、测试环境 |
WAR - 上下文配置 | 创建 XML 文件指向外部 WAR | 路径灵活;WAR 存放位置灵活 | 配置稍复杂 | 生产环境 |
目录 - 自动部署 | 复制目录到 webapps/ |
方便修改和调试,无需打包 | 目录混在 Tomcat 目录中;易被误删 | 开发环境(频繁调试) |
目录 - 上下文配置 | 创建 XML 文件指向外部目录 | 最灵活强大;路径、位置都灵活;与 Tomcat 解耦 | 配置稍复杂 | 生产环境首选 |
重要配置参数
在上下文配置文件(XML)中,有一些常用参数:
docBase
:必需。指定 WAR 包或应用程序目录的绝对路径。path
:指定上下文路径。但如果 XML 文件名不是ROOT.xml
,则路径由文件名决定,忽略此属性。通常不设置。reloadable
:(默认为false
)如果设为true
,Tomcat 会监视/WEB-INF/classes/
和/WEB-INF/lib/
的变化,并自动重新加载应用。生产环境应设为false
以提升性能。unpackWAR
:是否将 WAR 包解压(默认为true
)。如果设为false
,Tomcat 会直接从 WAR 包中运行应用而不解压。
生产环境建议
对于生产环境,最推荐的方式是:
使用上下文配置文件来部署一个解压后的应用程序目录。
-
将你的应用打包为 WAR,然后手动解压 到一个固定的、独立于 Tomcat 的目录(如
/opt/myapp/
)。bash# 在部署脚本中完成 mkdir -p /opt/myapp unzip -q myapp.war -d /opt/myapp/
-
在
$CATALINA_BASE/conf/Catalina/localhost/
下创建配置文件(如myapp.xml
),内容为:xml<Context docBase="/opt/myapp" />
-
将 WAR 包和
webapps
目录清理干净。
这样做的好处:
- 清晰:应用和 Tomcat 本身分离,目录结构清晰。
- 稳定:避免了 Tomcat 自动解压可能带来的问题(如文件锁、解压失败)。
- 可控:部署过程完全由你的脚本或运维工具控制,而不是依赖 Tomcat 的自动机制。
- 安全:可以更容易地设置文件和目录的权限。
希望这个详细的解释能帮助你更好地理解 Tomcat 的部署机制!
配置样例
xml
${tomcat_home}/conf/Catalina/localhost/app2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/data/webapps/app2" path="/app2" debug="0" reloadable="true"/>
myapp.xml -- path 不配置默认使用 myapp.xml的文件名 myapp ${tomcat_home}/conf/Catalina/localhost/myapp.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/data/webapps/myapp" path="/myapp">
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="4" maxIdle="2" maxWait="5000" name="jdbc/myapp" type="javax.sql.DataSource" url="jdbc:mysql://106.114.118.218/myappdb?useUnicode=true&characterEncoding=utf8" username="myapp" password="myapp"/>