基于 war 的 Spring Boot 工程

基于 war 的 Spring Boot 工程

Spring Boot 工程被打为了 Jar 包,以可执行文件的形式出现的,其原理是使用了 Spring Boot 内嵌的 Tomcat 作为 Web 服务器来运行 web 应用的。新版 Dubbo 的监控中心工程就是典型的应用。

但在实际生产环境下,对于访问量不大的应用,直接以 Jar 包的形式出现,使用起来是非常方便的,不用部署了。但对于访问量较大的 Web 工程,我们不能使用 Tomcat,而要使用更为高效的商业 web 容器,例如 JBOSS、WebLogic 等,此时我们需要的是 war 包而非 jar包。

下面我们来看一下如何使用 Spring Boot 将工程打为 war 包。

工程创建

其创建过程与前面打为 jar 包的相似,只以下面的窗口中选择 Packaging 为 War 即可。
在这里插入图片描述

创建war的Spring Boot工程,工程结构会有一些变化:

  • 发现多了一个ServletInitializer类
    在这里插入图片描述 在这里插入图片描述
    这个类有什么用?

    • 首先要知道如果是jar包方式启动,入口是启动类的main方法,调用SpringApplication.run方法的时候会将“配置类“传进去,执行的时候底层会启动一个内置的tocmat,这个时候底层直接new了一个TomcatStarter来初始化Servlet容器的(感兴趣看SpringBoot内置tomcat启动原理、以及SpringBoot初始化Servlet的源码分析
    • 如果是war包方式启动,入口就不是main方法了,而是靠web容器了,如果是servlet 3.0 可以不用web.xml,靠3.0的新特性ServletContainerInitializer,会用SPI服务发现机制自动加载,最终就会加载到这个ServletInitializer,为什么要重写configure方法?因为jar包方式启动main方法的时候指定了配置类,但是war包方式启动的时候,没有指定,这里就是用来指定配置类的。

      关于Servlet 3.0 新特性,感兴趣可以看这篇博文https://my.oschina.net/u/4008390/blog/3045426
  • 发现pom中被tomcat的依赖范围被指定为了provided
    在这里插入图片描述
    这个很好理解,war包方式启动就不需要内置tomcat了,所以provided方式打包不会把tomcat打包进去,而在编译测试的时候需要可以本地启动测试

总结:如果springBoot工程想使用外置Servlet容器的步骤:

  • 1 必须创建war项目,需要建好web项目的目录结构
  • 2 嵌入式Tomcat依赖scope指定provided
  • 3 编写SpringBootServletInitializer类子类,并重写configure方法

工程编辑

在启动类所在包下新建子包,并新建一个controller

@RestController
public class SomeController {
    
    

    @GetMapping("/some")
    public String someHandler() {
    
    
        return "hello spring boot world";
    }
}

工程运行

(1) Idea 下运行与访问

打开启动类并直接运行即可启动 SpringBoot 工程:
在这里插入图片描述

(2) 打包部署

  • A、打包
    运行 package 命令,其会打为 war 包。

  • B、 部署
    找到该 war 包,将其部署到 Tomcat 的 webapps 目录中,启动 Tomcat。
    在这里插入图片描述

  • C、 访问
    在浏览器中可以访问到该工程。注意,由于工程是部署到了 Tomcat 的 webapps 中,不是部署到 webapps/ROOT 中,所以在访问时需要指定工程名。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41947378/article/details/108729411