1. 前言

Spring Boot 版本: 2.4.4

SpringBoot官方文档——Create a Deployable War File

SpringBoot的 Web模块 默认内嵌了Tomcat作为Servlet容器,因此,我们可以直接编写SpringBoot 启动类,直接通过启动类,一键开启Tomcat服务,确实是 nb plus!!!

但是,有些情况下,我们的Tomcat服务器,需要另外专门部署,会更好维护,此时,我们就考虑排除SpringBoot 的 Web模块中的Tomcat依赖,进而可以将SpringBoot应用部署到外部的Tomcat容器中。

2 修改步骤

2.1 修改打包方式(jar -> war)

  1. <!-- 这里打成war包 若打jar,需将war改为jar -->
  2. <packaging>war</packaging>

2.2 排除 SprignBoot的Web模块中的Tomcat依赖

这里有两种方案:(官方文档使用第一种)

2.2.1 将嵌入的Tomcat依赖方式改成 provided

修改 pom.xml 文件,将嵌入的Tomcat依赖方式改成provided(编译、测试时将依赖的包加入本工程的classpath,运行时不加入,可以理解成运行时不使用Spring Boot 自带的Tomcat),确保嵌入式servlet容器不干扰war文件所部署到的servlet容器。

  1. <!--SpringBoot 的 Web模块内嵌的tomcat依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-tomcat</artifactId>
  5. <!-- 编译、测试时将依赖的包加入本工程的classpath,运行时不加入,可以理解成运行时不使用Spring Boot 自带的Tomcat -->
  6. <scope>provided</scope>
  7. </dependency>

注意:

将SpringBoot的Web模块 提供的嵌入式servlet容器依赖关系标记为provided时,将生成可执行的war文件,其中提供的依赖关系打包在 lib-provided 的目录中。

这意味着,除了可以部署到servlet容器之外,还可以通过在命令行上使用java -jar运行该应用程序。

2.2.2 直接排除Web模块中的Tomcat依赖

排除内嵌的Tomcat依赖

  1. <!-- SpringBoot的web模块 依赖-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. <exclusions>
  6. <!-- 排除SpringBoot的web模块默认内嵌的Servlet容器 Tomcat-->
  7. <exclusion>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-tomcat</artifactId>
  10. </exclusion>
  11. </exclusions>
  12. </dependency>

由于排除了Tomcat依赖,没有了servlet实现,因此,需要引入servlet依赖

  1. <!-- servlet 依赖 -->
  2. <dependency>
  3. <groupId>javax.servlet</groupId>
  4. <artifactId>javax.servlet-api</artifactId>
  5. <version>4.0.1</version>
  6. <!--<scope>provided</scope>-->
  7. </dependency>

注意:
Spring Boot 必须在Servlet 3.0规范以上容器中运行。

2.3 修改启动类,并重写初始化方法

如果打算以 war 或 jar (可执行应用程序) 的形式启动应用程序,则需要使用SpringBootServletInitializer回调可用的configure方法和类似于以下类的main方法中的共享方法来共享构建器的自定义项:

2.3.1 官方文档的写法

  1. @SpringBootApplication
  2. public class Application extends SpringBootServletInitializer {
  3. @Override
  4. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  5. return application.sources(Application.class);
  6. }
  7. public static void main(String[] args) {
  8. SpringApplication.run(Application.class, args);
  9. }
  10. }

或者

  1. @SpringBootApplication
  2. public class Application extends SpringBootServletInitializer {
  3. @Override
  4. protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  5. return configureApplication(builder);
  6. }
  7. public static void main(String[] args) {
  8. configureApplication(new SpringApplicationBuilder()).run(args);
  9. }
  10. private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) {
  11. return builder.sources(Application.class).bannerMode(Banner.Mode.OFF);
  12. }
  13. }

2.3.2 第二種方式

在SpringBoot中我们平常用main方法启动的方式,都有一个SpringBootApplication的启动类,类似代码如下:

  1. @SpringBootApplication
  2. public class Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(Application.class, args);
  5. }
  6. }

而我们现在需要类似于web.xml的配置方式来启动spring应用,为此,我们在Application类的同级添加一个SpringBootStartApplication类,其代码如下:

  1. // 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
  2. public class SpringBootStartApplication extends SpringBootServletInitializer {
  3. @Override
  4. protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  5. // 注意这里一定要指向原先用main方法执行的Application启动类
  6. return builder.sources(Application.class);
  7. }
  8. }

注意事项:
使用外部Tomcat部署访问的时候,application.properties(或者application.yml)中配置的
server.port =
server.servlet.context-path =
将失效,请使用,tomcat,webapps下项目名进行访问。
为了防止应用上下文所导致的项目访问资源载入不到的问题,
建议pom.xml档案中标签下新增标签:

  1. <build>
  2. <!-- 应与项目的context-path保持一致 -->
  3. <finalName>war包名稱</finalName>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-maven-plugin</artifactId>
  8. </plugin>
  9. </plugins>
  10. </build>

的作用:

  1. 如果设置就会按照你自己设定的名字作为包名

SpringBoot使用外置Tomcat - 图1

  1. 如果没有设置,打包后的报名——-artifactId与version拼接的结果
  2. SpringBoot使用外置Tomcat - 图2

    3 生成 webapp 目录

    SpringBoot使用外置Tomcat - 图3
    修改完成后, 记得apply,就会生成webapp目录,以及目录下的 /WEB-INF/web.xml 文件

    4 部署到外部的Tomcat容器

    4.1 打成 war 包

    在项目根目录下(即包含pom.xml的目录)(命令行 或 终端)执行maven打包操作:
    1. mvn clean package
    等待打包完成,出现 [INFO] BUILD SUCCESS 即为打包成功
    或者,直接使用 IDEA 打包
    SpringBoot使用外置Tomcat - 图4
    将war包放到Tomcat的weapps目录下,启动服务器就可以使用了