MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

SpringBoot进阶-如何为Spring Boot应用更换内置服务器?

2025-03-12 15:24 huorong 精选文章 5 ℃ 0 评论

在之前传统的Spring应用中我们都会采用外部容器来运行应用,但是在Spring Boot 中与传统应用的不同就说在Spring Boot应用中不需要额外的应用服务器也可以运行。这是是因为在Spring Boot应用中内置了一个内部容器,所以我们在项目启动的时候只需要启动Jar包即可。那么在Spring Boot中自带了那些内置的容器呢?并且如何使用这些内置容器呢?

Spring Boot 内置容器

在我们一般的SpringBoot项目中所指的容器都是指Servlet容器,根据Spring Boot版本的不同,内置容器Servlet的版本也略有差异。如下图所示。

从图中我们可以看出了Spring Boot 与Servlet的对应关系。在使用Spring Boot 应用的时候,我们不需要添加任何的配置,只需要添加与Web开发相关的Starter就可以将项目转换成Web应用开发模式。在应用启动的时候,就会采用系统内置的容器来运行项目。相比较于传统的开发方式,省去了部署容器的步骤,整体的提升了开发效率。那么这套容器运行的流程到底是什么样子呢?

Spring Boot 容器运行流程

首先来讲根据Spring Boot的自动配置的原理,首先需要检查的就是再对应的项目依赖是否存在,并且相关的自动场景启动器是否存在。在相关依赖中我们会找到如下的依赖项

    
      org.springframework.boot
      spring-boot-starter-tomcat
      2.7.5
      compile
    

并且自动运行的Tomcat其主要运行原理就是通过这个Starter来实现的。并且查看其相关的依赖会发现有如下的核心依赖项。

    
      org.apache.tomcat.embed
      tomcat-embed-core
      9.0.68
      compile
      
        
          tomcat-annotations-api
          org.apache.tomcat
        
      
    

所以,从上面的代码中我们可以看出,Spring Boot的内置容器是基于Apache Tomcat的内置版本实现。使用了内置的Tomcat就不需要将应用打包成War包,只需要将应用打包成JAR包的方式即可运行,这也正是Spring Boot可以单独运行不需要额外的应用服务器的原因。这种实现方式让传统的Web应用服务更容易被微服务化或者是容器化。关于Spring Boot中对于Tomcat的自动配置,有兴趣的读者可以自己查看相关的代码,这里不做多余说明了。

虽然我们说了Tomcat作为SpringBoot应用的默认的应用服务器,是不是就是说Spring Boot支持Tomcat作为内置服务器呢?显然不是,我们看到在Spring Boot项目中Tomcat容器是以依赖的方式被添加到POM文件中的,也就是说我们可以将容器替换成为其他的服务容器。这里我们以Jetty为例来实现容器的替换。

Spring Boot Tomcat容器替换为Jetty容器

既然要使用其他的容器,那么首先就需要将当前容器从项目依赖中移除。我们可以通过下面这种方式来进行移除,并且将Jetty容器添加到项目项目中


    org.springframework.boot
    spring-boot-starter-web
    
        
            org.springframework.boot
            spring-boot-starter-tomcat
        
    



    org.springframework.boot
    spring-boot-starter-jetty

这个时候我们可以启动项目,就可以看到容器已经被替换成了Jetty容器

虽然大部分的Spring Boot应用都是运行在Tomcat容器中的,但是在很少的一部分情况下,我们还是希望能将其运行到外部的Apache Tomcat容器中,这个时候,我们应该如何实现这个操作呢?

如何将Spring Boot应用运行到外部的Tomcat容器中?

既然要采用外部容器的方式来运行项目,那么首先我们就得从Tomcat的官方网站上找到相关的Tomcat容器将外部容器的环境搭建好,这里关于Tomcat容器的搭建读者可以参考网络教程。这里不做过多的说明。

我们知道Spring Boot应用默认的打包方式是Jar的方式,既然我们要使用外部的Tomcat来运行的话,那么就得将打包方式改成War包的方式。这个时候就需要我们在POM文件中添加如下的操作。将Jar包方式改成War包方式。

war

接下来就是将内置的Tomcat依赖关系中进行移除操作。为了保证编译能够成功,需要将Servlet的相关依赖添加到POM文件中。


      
          org.springframework.boot
          spring-boot-starter-web
          
              
                  org.springframework.boot
                  spring-boot-starter-tomcat
              
          
      

      
          org.springframework.boot
          spring-boot-starter-tomcat
          provided
      
      
  

修改完成之后,需要修改原来的打包方式,既然我们要采用外部容器,那么我们的打包方式就要变成War包方式,所以需要将 Build模块中的相关打包的插件去掉。代码如下

    
        ${artifactId}






    

由于我们将Tomcat的的相关依赖移除了,所以说相关的自动配置内容也被移除了,所以这个时候我们需要手动将相关的应用初始化的容器中进行运行。这里Spring Boot提供了一个
SpringBootServletInitializer的类这个类继承了WebApplicationInitializer。关于WebApplicationInitializer的相关内容,有兴趣的读者可以自己了解。

public abstract class SpringBootServletInitializer implements WebApplicationInitializer {
}

我们在项目主启动类上进行如下的修改。

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

这个时候我们就可以通过package的方式进行打包测试了。会看到打包完成之后在对应的target目录下面生成了相应的war包

我们可以通过修改Tomcat的相关配置来查看项目存在。我们可以进入到Tomcat的conf目录下修改如下的配置文件 tomcat-users.xml

  
  
  
  

将War包放入的WebAPP目录中启动Tomcat

点击Manager APP 输入配置好的用户名密码进行登录,会看到如下的页面。并且在应用管理中看到了demo的测试项目

到这里我们就实现了在外部容器中运行Spring Boot项目的全部功能。

总结

上面我们介绍了如何替换SpringBoot中的运行容器,在不同的项目中根据不同的项目需求,开发者可以使用不同的方式进行部署,如果想要了解内置容器相关的更多配置内容,可以参考Spring Boot的官方文档实现。

Tags:安装tomcat步骤

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言