序言
SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架,我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中,我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat 服务器的操作流程。
一、修改打包方式
首先,需要将 Spring Boot 的打包方式从 jar
修改为 war
。打开 pom.xml 文件,找到 标签,将其内容改为 war。
<packaging>war</packaging>
二、排除 tomcat 依赖
排除 tomcat 依赖的方式有许多,我们可以采用以下简单的方式:直接变更 tomcat 的依赖范围为 provided
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
三、配置 SpringBoot 启动类
// SpringBoot 的启动类
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
// 自定义 ServletInitializer
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(App.class);
}
}
- Servlet 容器加载机制:在 Java Web 开发中,Servlet 容器负责加载和管理 Servlet。Servlet 容器会在启动时读取
web.xml
文件(或者使用 Servlet 3.0 注解)来获取应用程序的配置信息,并加载相应的Servlet。对于 SpringBoot 应用程序来说,它也是一个 Servlet,需要被加载到 Servlet 容器中才能运行。 - SpringBoot 启动类:SpringBoot 应用程序通常有一个主类,其中包含 main 方法。这个主类使用 SpringBoot 的
@SpringBootApplication
注解标记,它告诉 SpringBoot 应用程序的入口点。在内嵌 Tomcat 的情况下, SpringBoot 会自动检测并启动应用程序,而在外部 Tomcat 中,我们需要告诉 Tomcat 如何加载 SpringBoot 应用程序。 - SpringBootServletInitializer 作用:SpringBootServletInitializer 是 SpringBoot 提供的一个抽象类,用于支持将 SpringBoot 应用程序部署到外部 Servlet 容器中。通过继承 SpringBootServletInitializer 类并重写其 configure 方法,我们可以告诉外部 Servlet 容器如何初始化 SpringBoot 应用程序,并指定 SpringBoot 应用程序的主类。
- configure 方法重写:在 configure 方法中,我们需要调用 SpringApplicationBuilder 的 sources 方法并传递 SpringBoot 应用程序的主类,以告诉外部 Servlet 容器从哪里加载 SpringBoot 应用程序。SpringBoot 会在部署到外部 Servlet 容器时自动检测到这个 configure 方法,并使用它来初始化应用程序。
四、构建 war 包
执行 mvn clean package
命令完成打包
mvn clean package
五、部署到 Tomcat
推荐阅读
- Docker Compose:简化多容器应用部署
- cURL:命令行下的网络工具
- RabbitMQ(Docker 单机部署)
- 深入理解 Java 并发:AbstractQueuedSynchronizer 源码分析
- 深入了解 Arthas:Java 应用程序诊断利器