SpringBoot 热部署
概述
1、场景:本地调试、线上发布都要重启服务器,重启服务器浪费了大量的开发、调式时间
PS:思考如何做到发布新程序不需要重启服务器?
2、优点:
(1)本地、线上都适用
(2)无需重启服务器
- 提高开发、调式效率;
- 提高发布、运维效率,降低运维成本
3、热部署与热加载
(1)联系:
- 不重启服务器编译/部署项目
- 基于java类加载实现
(2)区别:
① 部署方式
- 热部署在服务器运行时重新部署项目
- 热加载是在运行时重新加载class
② 实现原理
- 热部署直接重新加载整个应用(占用内存和费时间)
- 热加载是在运行时重新加载class
PS:一个是针对整个应用;一个是针对类
③ 使用场景
- 热部署更多的是在生产环境使用
- 热加载更多的是在开发环境使用
4、原理解析
(1)类加载过程
(2)加载五个阶段
① final 修饰不会触发初始化
② 对类进行反射调用,若为调用则会调用初始化
③ 初始化类,若父类未初始化,则会先初始化父类再初始化子类
④ 若程序自定义主类 main() 方法,则虚拟机会先初始化main方法所在类
⑤ java 1.7动态语言
(3)java 类加载器特点
① 由AppClass loader (系统类加载器)开始加载指定类
② 类加载器将任务交给其父,如果其父找不到,再由自己去加载
③ BootStrap Loader是最顶级的类加载器
(4)java类热部署方式
① 类的热加载:通过类的热加载实现热部署,继承java.lang.ClassLoader,重写findClass方法
② 配置 Tomcat:通过配置Tomcat实现热部署
- 直接把项目web文件夹放在wepApp里
- 在tomcat\conf\server.xml中的内部添加标签
- 在tomcat\conf\Catalina\localhost中添加一个XML
SpringBoot热部署实现
1、使用Spring loaded实现:
(1)maven启动方式,在pom.xml中添加依赖,启动方式:
- 启动方式一,需要提前装好maven,然后在命令行进入项目文件夹,输入mvn spring-boot:run
- 启动方式二,需要提前下载好springloaded-1.2.6.RELEASE.jar,修改run configuration,编辑Arguments,如下
2、使用spring-boot-devtools
PS:
- 若idea 启用热部署,无法使用debug模式打断点调式,需要在pom.xml添加或修改以下配置:
<plugins>
<!-- 启用热部署,支持debug断点配置 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>false</fork>
</configuration>
</plugin>
</plugins>
- 热部署配置后不起作用,请参考:Spring-boot-devtools 在Idea中不起作用解决办法
SpringBoot 项目发布
1、构建Jar/War包,使用内置Tomcat,采用命令行运行SpringBoot程序
PS:Jar不打包静态文件,如html、js等前端文件,若为前后端分离项目,可用jar包方式;若前后端项目都在一起,则使用War包
2、构建War包,发布到外置Tomcat
(1)pom.xml加入以下依赖
<!-- Servlet web -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--排除这个自带slf4j-log4j12 避免与我们引入的包冲突-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
(2)添加启动文件
package com.mall.api;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
public class ServletApiApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// TODO Auto-generated method stub
return builder.sources(ApiApplication.class);
}
}
PS:
- 开发环境无法启动:则删除已有tomcat,重新部署启动
- 若为jar包,只能用java application 或 spring boot 应用程序方式启动;而war包,除以上方式,还可用服务器(tomcat)方式启动