Spring Boot热部署及优缺点比较

在开发中我们修改一个Java文件后想看到效果不得不重启应用,这导致大量时间花费,我们希望不重启应用的情况下,程序可以自动部署(热部署)。有以下四种情况,如何能实现热部署。

1、模板引擎(不支持Java代码修改热部署)

在Spring Boot中开发情况下禁用模板引擎的cache
页面模板改变ctrl+F9可以重新编译当前页面并生效

2、Spring Loaded

2.1 Spring Loaded介绍

Spring官方提供的热部署程序,实现修改类文件的热部署。

2.2 Spring Loaded 使用

1545108652972

2.2.3 Spring Loaded缺点

引自spring-loaded官方 https://github.com/spring-projects/spring-loaded

Q. Does it reload anything that might change in a class file? A. No, you can’t change the hierarchy of a type. Also there are certain constructor patterns of usage it can’t actually handle right now.

并非所有改变都支持热部署,对框架支持比较弱。

3、JRebel(推荐)

收费的一个热部署软件,安装插件使用即可。

1545107985824

Jrebel 破解建议查看:https://blog.csdn.net/lawsonjin/article/details/76422807

4、Spring Boot Devtools(推荐)

4.1 Spring Boot Devtools原理

深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。

4.2 Spring Boot Devtools配置步骤

4.2.1 maven 依赖

maven引入 Spring Boot Devtools 依赖

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 -->
</dependency>

4.2.2 maven 插件

在pom.xml文件中,增加如下插件。

1
2
3
4
5
6
7
8
9
10
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<!-- 如果没有该项配置,devtools不会起作用,即应用不会restart ,(这里一直没搞懂)-->
</configuration>
</plugin>
</plugins>

4.2.3 特殊配置

(1) devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties或application.yml 文件中配置spring.thymeleaf.cache=false来实现),实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。

1
2
3
4
5
6
7
8
spring:
thymeleaf:
cache: false
devtools:
restart:
enabled: true
additional-paths: src/main/java
exclude: WEB-INF/**

(2)配置了后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。

(3)默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。

如果你是eclipse开发,现在已经可以重启项目来使用了。但是,如果你是idea的话,请看4.2.4 的设置!

4.2.4 IDEA 配合Spring Boot Devtools特殊配置

Intellij IEDA和Eclipse不同,Eclipse设置了自动编译之后,修改类它会自动编译,而IDEA在非RUN或DEBUG

4.2.4.1 在设置中打开自动编译

左上角File->Settings->Build,Execution,Deployment->Compiler,选中Build project automaticall

1545110399527

4.2.4.2 打开运行时编译

按快捷键 Shift+Ctrl+Alt+/ ,选择 Registryctrl+shift+alt+/(maintenance)
勾选compiler.automake.allow.when.app.running

1545110475278

4.2.4.3 关闭自动保存

关闭自动保存

File—>settings—->System Settings—>去掉勾选synchronize files on frame or editor tab activation和去掉勾选save files on frame deactivation

1545111482945

1
2
3
synchronize files on frame or editor tab activation,就是当前应用是intellij时,自动保存文件,比如从浏览器切换到intellij,intellij就是active,会自动保存。

save files on frame deactivation,就是从intellij切换到其他应用时,保存文件。
标志修改文件为星号

File—->Settings—–>Editor—->General—->Editor tabs—->勾选 mark modified files as asterisk

1545111450758

4.3 Spring Boot Devtools 测试问题反馈

实际测试发现有些修改,需要一并修改标有@SpringBootApplication注解的类,才可以保证修改部署成功,特别是修改Controller标注的类。

1
2
3
4
5
6
7
8
@SpringBootApplication
public class SpringbootApplication {

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

}

5.欢迎关注米宝窝,持续更新中,谢谢!

米宝窝 https://rocklei123.github.io/

-------------本文结束感谢您的阅读-------------
欢迎持续关注米宝窝,定期更新谢谢! https://rocklei123.github.io/
欢迎持续关注我的CSDN https://blog.csdn.net/rocklei123
rocklei123的技术点滴
熬夜写博客挺辛苦的,生怕猝死,所以每当写博客都带着听诊器,心脏一有异响,随时按Ctrl+S。
rocklei123 微信支付

微信支付

rocklei123 支付宝

支付宝