网站首页 > java教程 正文
Springboot工程war包模式启动流程
出于项目部署的需要,目前做的一个项目需要通过war包进行部署,那么就带来一个问题,就是在原本的main方法中进行的一些逻辑会失效,以至于出现一些不可预知的错误#1。在这里加载了一个classpath下的一个json文件,将其加载到系统属性中,但是在后续运行时出现NullPointException。很纳闷,我这本地运行的好好的,咋发布到环境上就出问题了,后面一翻源码才明白,原来我们本地运行是java -jar模式运行的,此时虚拟机运行的是工程的main方法。但是发布到环境后,是以war包运行的,此时将不会执行本工程的main方法,而是由tomcat的main方法进行启动。这个时候问题问题就来了,数据没加载到全局系统变量中。
1#
在查阅了spring-web这个依赖后,在META-INF下有services的文件夹,
javax.servlet.ServletContainerInitializer,这个东西具体是干什么的呢?其实就是在tomcat启动后,通过JDK的SPI调用实现了文件里面的类,这里spring使用了
org.springframework.web.SpringServletContainerInitializer,打开这个类会发现class上有个HandlesTypes的注解,那么这个里面修饰的class是做什么用的呢,主要作为onStartup方法的入参使用——webAppInitializerClasses
会收集所有实现了这个接口的类,循环调用他们的onStartup方法。
#2
#3
然后我们的启动类
org.springframework.boot.web.servlet.support.SpringBootServletInitializer刚好又是它的子类,那么会调用到它。这里采用了模板设计模式。
org.springframework.boot.web.servlet.support.SpringBootServletInitializer#configure这个方法作为
org.springframework.boot.web.servlet.support.SpringBootServletInitializer#
createRootApplicationContext的一部分,作为钩子方法影响主流程。构建出一个SpringApplication对象后执行它的run方法,这里就是最常规的Springboot工程启动了
#4
最后的解决方案是通过订阅spring的容器刷新事件来完成静态数据的加载#5,因为无论是jar包启动,还是war包启动,都是要调用spring的核心方法——refresh,当刷新完成后,会抛出一个ContextRefreshedEvent事件,所有订阅这个事件的bean都会收到,在这里进行部分操作完成一些数据加载工作
#5
- 上一篇: 无需修改注册表,也能双击jar包启动
- 下一篇: SpringBoot项目jar、war包启动解析
猜你喜欢
- 2025-06-15 Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 2025-06-15 推荐一款超棒的SpringCloud 脚手架项目
- 2025-06-15 IDEA将项目打包成jar包(idea打包普通java项目)
- 2025-06-15 Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 2025-06-15 记录Dockerfile将jar包构建成部署所需的镜像
- 2025-06-15 项目基础部署汇总八---linux下xxl-job安装
- 2025-06-15 Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 2025-06-15 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 2025-06-15 如何将本地JAR文件添加到Maven项目中
- 2025-06-15 Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
你 发表评论:
欢迎- 06-15Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 06-15推荐一款超棒的SpringCloud 脚手架项目
- 06-15IDEA将项目打包成jar包(idea打包普通java项目)
- 06-15Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 06-15记录Dockerfile将jar包构建成部署所需的镜像
- 06-15项目基础部署汇总八---linux下xxl-job安装
- 06-15Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 06-15终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 最近发表
-
- Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 推荐一款超棒的SpringCloud 脚手架项目
- IDEA将项目打包成jar包(idea打包普通java项目)
- Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 记录Dockerfile将jar包构建成部署所需的镜像
- 项目基础部署汇总八---linux下xxl-job安装
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 如何将本地JAR文件添加到Maven项目中
- Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)