将 Spring Boot WAR 部署到 Tomcat 服务器

更新于 2025-12-30

baeldung 2024-01-08

1. 简介

Spring Boot 是一个“约定优于配置”的框架,可帮助我们快速创建可用于生产的 Spring 项目。而 Tomcat 是最流行的 Java Servlet 容器之一。

默认情况下,Spring Boot 构建的是一个独立的 Java 应用程序,可以作为桌面应用运行,也可以配置为系统服务。然而,在某些环境中,我们无法安装新服务或手动运行应用程序。

与独立应用程序不同,Tomcat 通常以服务形式安装,可以在同一个应用进程中管理多个应用程序,从而避免为每个应用单独配置运行环境。

在本教程中,我们将创建一个简单的 Spring Boot 应用,并对其进行调整,使其能够在 Tomcat 中运行。

2. 创建 Spring Boot 应用程序

首先,使用 Spring Boot 提供的 starter 模板创建一个简单的 Web 应用:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>3.1.5</version> 
    <relativePath/> 
</parent> 
<dependencies>
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
</dependencies>

请确保使用最新版本的 spring-boot-starter-parentspring-boot-starter-web

除了标准的 @SpringBootApplication 注解外,无需额外配置,因为 Spring Boot 会自动完成默认设置。

接下来,添加一个简单的 REST 接口,用于返回一些有效内容:

@RestController
public class TomcatController {

    @GetMapping("/hello")
    public Collection<String> sayHello() {
        return IntStream.range(0, 10)
          .mapToObj(i -> "Hello number " + i)
          .collect(Collectors.toList());
    }
}

最后,执行 mvn spring-boot:run 启动应用,并在浏览器中访问 http://localhost:8080/hello 查看结果。

3. 构建 Spring Boot 的 WAR 包

Servlet 容器要求应用程序满足一定的规范才能部署。对于 Tomcat 来说,这个规范是 Servlet API 3.0。

为了让我们的应用满足这一规范,需要对源代码进行少量修改。

首先,将打包方式从 JAR 改为 WAR。为此,在 pom.xml 中添加以下内容:

<packaging>war</packaging>

其次,为了避免生成的 WAR 文件包含版本号,可修改最终文件名:

<build>
    <finalName>${artifactId}</finalName>
    ...
</build>

然后,添加 Tomcat 依赖,并将其作用域设为 provided(表示该依赖由容器提供):

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

最后,通过实现 SpringBootServletInitializer 接口来初始化 Tomcat 所需的 Servlet 上下文:

@SpringBootApplication
public class SpringBootTomcatApplication extends SpringBootServletInitializer {
}

构建适用于 Tomcat 部署的 WAR 包,只需执行:

mvn clean package

构建完成后,WAR 文件将生成在 target/spring-boot-deployment.war(假设 Maven 的 artifactId 为 “spring-boot-deployment”)。

需要注意的是,此配置会使 Spring Boot 应用变为非独立应用(若想恢复为独立运行模式,可移除 Tomcat 依赖的 provided 作用域)。

4. 将 WAR 部署到 Tomcat

要将我们的 WAR 文件部署并运行在 Tomcat 中,请完成以下步骤:

  1. 下载 Apache Tomcat 并解压到某个 tomcat 目录;
  2. 将生成的 WAR 文件(如 target/spring-boot-deployment.war)复制到 tomcat/webapps/ 目录;
  3. 打开终端,进入 tomcat/bin 目录,执行:
    • Windows:catalina.bat run
    • Unix/Linux/macOS:catalina.sh run
  4. 在浏览器中访问:http://localhost:8080/spring-boot-deployment/hello

以上是一个快速的 Tomcat 设置流程。如需完整的安装和配置指南,请参考 Tomcat 安装文档。此外,还有其他多种方式可以将 WAR 文件部署到 Tomcat。

5. 结论

在本文中,我们创建了一个简单的 Spring Boot 应用,并将其改造为可在 Tomcat 服务器上部署的 WAR 应用。这使得 Spring Boot 应用能够无缝集成到传统的 Java EE 部署环境中。