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-parent 和 spring-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 中,请完成以下步骤:
- 下载 Apache Tomcat 并解压到某个
tomcat目录; - 将生成的 WAR 文件(如
target/spring-boot-deployment.war)复制到tomcat/webapps/目录; - 打开终端,进入
tomcat/bin目录,执行:- Windows:
catalina.bat run - Unix/Linux/macOS:
catalina.sh run
- Windows:
- 在浏览器中访问:
http://localhost:8080/spring-boot-deployment/hello
以上是一个快速的 Tomcat 设置流程。如需完整的安装和配置指南,请参考 Tomcat 安装文档。此外,还有其他多种方式可以将 WAR 文件部署到 Tomcat。
5. 结论
在本文中,我们创建了一个简单的 Spring Boot 应用,并将其改造为可在 Tomcat 服务器上部署的 WAR 应用。这使得 Spring Boot 应用能够无缝集成到传统的 Java EE 部署环境中。