Tomcat 中部署 Web 应用

发布于:2025-09-01 ⋅ 阅读:(14) ⋅ 点赞:(0)

在 Tomcat 中部署 Web 应用主要有两种形式:部署 WAR 包部署解压后的目录。下面我将详细解释它们的配置方式。

核心概念

  • WAR 包:一个标准的 Java Web 应用程序压缩包,遵循特定的目录结构。Tomcat 在启动或运行时检测到 WAR 包后,会自动将其解压到同名目录中,然后加载运行。
  • 部署目录:就是 WAR 包解压后的完整目录结构(包含 WEB-INF, META-INF 等)。Tomcat 可以直接加载这个目录来运行应用。

部署位置

无论哪种方式,应用的放置位置(我们称之为“部署位置”)主要有以下三个:

  1. $CATALINA_BASE/webapps/ 目录

    • 这是 Tomcat 默认的、自动部署的目录。你只需将 WAR 包或应用目录放到这里,Tomcat 就会自动处理(默认配置下)。
    • $CATALINA_BASE 通常就是你的 Tomcat 安装目录。
  2. $CATALINA_BASE/conf/Catalina/[hostname]/ 目录

    • 这是通过XML上下文配置文件进行部署的位置,可以实现更精细的控制。
  3. 服务器上的任意位置

    • 通过XML上下文配置文件指定一个绝对路径,可以将应用部署在 webapps 之外的任何地方。

方式一:部署 WAR 包

1. 自动部署 (Hot Deployment)

这是最简单、最常见的方式。

  • 步骤:直接将你的 your-application.war 文件复制到 $CATALINA_BASE/webapps/ 目录下。
  • 原理
    • 如果 Tomcat 正在运行,它会通过“部署器”组件监听 webapps 目录的变化,自动解压 WAR 包(生成 your-application/ 目录)并加载应用。
    • 如果 Tomcat 未启动,它会在启动时自动解压并加载 webapps 目录下的所有 WAR 包。
  • 访问路径:应用的上下文路径(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 目录,可以实现更灵活的管理。

  • 步骤
    1. 将你的 your-application.war 文件放在一个任意位置,例如 /opt/applications/myapp.war
    2. $CATALINA_BASE/conf/Catalina/localhost/ 目录下(localhost 是你的主机名),创建一个 XML 配置文件,例如 myapp.xml (这个文件名决定了最终的上下文路径)。
    3. 在该配置文件中指定 WAR 包的路径:
      <!-- 文件内容:$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)

这是部署解压目录最强大和灵活的方式。

  • 步骤
    1. 将你的应用目录放在一个任意位置,例如 /opt/applications/myapp-dir/
    2. $CATALINA_BASE/conf/Catalina/localhost/ 目录下创建一个 XML 配置文件,例如 myapp.xml
    3. 在该配置文件中指定应用目录的绝对路径:
      <!-- 文件内容:$CATALINA_BASE/conf/Catalina/localhost/myapp.xml -->
      <Context docBase="/opt/applications/myapp-dir" />
      
      你也可以在配置文件中添加 reloadable="true" 属性,让 Tomcat 在检测到 WEB-INF/classesWEB-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 包中运行应用而不解压。

生产环境建议

对于生产环境,最推荐的方式是:

使用上下文配置文件来部署一个解压后的应用程序目录。

  1. 将你的应用打包为 WAR,然后手动解压到一个固定的、独立于 Tomcat 的目录(如 /opt/myapp/)。
    # 在部署脚本中完成
    mkdir -p /opt/myapp
    unzip -q myapp.war -d /opt/myapp/
    
  2. $CATALINA_BASE/conf/Catalina/localhost/ 下创建配置文件(如 myapp.xml),内容为:
    <Context docBase="/opt/myapp" />
    
  3. 将 WAR 包和 webapps 目录清理干净。

这样做的好处:

  • 清晰:应用和 Tomcat 本身分离,目录结构清晰。
  • 稳定:避免了 Tomcat 自动解压可能带来的问题(如文件锁、解压失败)。
  • 可控:部署过程完全由你的脚本或运维工具控制,而不是依赖 Tomcat 的自动机制。
  • 安全:可以更容易地设置文件和目录的权限。

希望这个详细的解释能帮助你更好地理解 Tomcat 的部署机制!

配置样例

${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&amp;characterEncoding=utf8" username="myapp" password="myapp"/>

网站公告

今日签到

点亮在社区的每一天
去签到