当前位置: 首页 > article >正文

Springboot使用war启动的配置

1、前言

Springboot 默认的打包方式是jar 的方式。启动方式也比较简单java -jar xxx.jar。但是很多时候,我们会针对老项目的改造,老项目都是使用传统的war 借助tomcat 启动。可能原来的tomcat 中配置茫茫复杂的东西,如分布式session、调优参数等。下来一起看看Springboot 是如何打成war 的。

2、官方文档解释

本文以springboot 1.5.10.RELEASE为例。

官网地址:https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/html/howto-traditional-deployment.html#howto-create-a-deployable-war-file

文章中介绍了如何创建一个发布的war 包文件。

第一步:需要继承SpringBootServletInitializer

第二步:重写configure 方法,参数为当前启动类的Class即可

第三步:修改pom文件<packaging>war</packaging>

第四步:将内置的tomcat的生命周期标记为编译期可用,<scope>provided</scope>

到这里Springbootwar 包形式就打好了,可以愉快的部署发布了。

以上的打包方式都是基于官方文档中Servlet 3.0 的方式打包的,同时官方还对更低版本的Servlet 2.5 做了说明,有兴趣的可以去看看。

3、遇到的问题以及解决

Springboot 1.5.10.RELEASE 这个版本默认的内置tomcat的版本是8.5.27

由于老项目都是部署在tomcat7 的,所以打成war 后想部署在tomcat7上。就会出现版本不兼容的问题。

直接使用外部的tomcat7启动,非常丝滑可以正常启动,但是有瑕疵。

启动成功后可以正常访问,但是启动日志会报错,就是Tomcat7 不能解析部分jar 中的字节码。

日志中就表示解析不了byte-buddy-agent-1.14.11 ,只需要降低byte-buddy-agent 版本即可。

笔者遇到的包括:fastjson2guava高版本均会编译报错。降低版本后问题解决。

直接使用tomcat8部署也是没有问题,会避免这些问题。

4、使用War启动的原理

Servlet容器 启动使用了SPI的机制。会加载org.springframework.web.SpringServletContainerInitializer

SpringServletContainerInitializer 上面标注了注解@HandlesTypes ,再启动的时候自行加载实现org.springframework.web.WebApplicationInitializer 这个接口的类。将实现类字节码集合的方式传入onStartup方法,然后再分别调用各自的onStartup 方法。

WebApplicationInitializer 中有唯一的方式方法onStartup 方法。可以用来配置servletfilters上下文参数

SpringBootServletInitializer 实现了 WebApplicationInitializer ,自然也会执行相应的onStartup 方法。

创建web容器。主要代码块

  • builder.main(getClass()) ,传入Main 方法。

  • builder = configure(builder) Springboot 使用war 启动要重新的方法,传入当前类的字节码

  • configure 方法是用来给父子容器使用的。再启动过程中会发现,不重写该方法依然可以正常启动并访问。

具体创建Web容器的源码:

5、番外

在使用springboot 1.5.10.RELEASE jar 启动之后遇到的问题:

  • 搭配SpringCloud微服务时,第一次访问会比较慢,后面就正常了

  • 使用Springboot 启动时,客户端调用时,部分接口会出现不定时的超时。

目前不知道具体的原因。解决方案也是从jar 改成war 启动后,这些问题就解决了。有知道大佬,可以留言交流。
流。


http://www.kler.cn/a/516748.html

相关文章:

  • Qt——引用第三方SDK lib库的使用方法
  • Centos 修改历史读录( HISTSIZE)
  • 算法随笔_18: 划分字母区间
  • Git 详细安装教程以及gitlab添加SSH密钥
  • 考研机试:买房子
  • 基于Springboot + vue实现的美发门店管理系统
  • 知识图谱结合大模型用于聊天分析
  • excel批量提取批注
  • c# 打印字符串
  • 迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译
  • C语言常用知识结构深入学习
  • vue项目的创建
  • GPU算力平台|在GPU算力平台部署MedicalGPT医疗大模型的应用教程
  • MyBatis最佳实践:MyBatis 框架的缓存
  • 3、搭建企业知识库:从需求分析到方案设计
  • 配电网的自动化和智能化水平介绍
  • Python中使用Ollama API
  • SpringBoot的Swagger配置
  • Javaweb之css
  • 时序数据库的使用场景
  • openresty(nginx)+lua+kafka实现日志搜集系统
  • 【Redis】事务
  • Windows Docker Desktop安装及使用 Docker 运行 MySQL
  • elasticsearch segment数量对读写性能的影响
  • STM32_SD卡的SDIO通信_基础读写
  • 互联网产品品牌形象构建与开源AI智能名片S2B2C商城小程序的应用研究