Spring boot热部署配置
转自https://www.zybuluo.com/weiys/note/1141626
使用spring boot时,修改类文件或资源文件时,需要重新启动应用才生效,而且一般应用重启消耗时间比较长,非常影响开发效率。这里提供了两种方案解决应用热部署的问题。
- 使用spring-boot-devtools模块
- 使用Jrebel工具
基于spring-boot-devtools的热部署
spring-boot-devtools是spring为开发者提供的支持spring boot应用热部署的模块,以提高开发效率,它的实现原理是提供两个ClassLoader,一个基类ClassLoader用于加载不改变的类(如第三方jar包),另一个重启类ClassLoader用于加载应用中会变化的Class。当应用程序重新启动时,重启动类ClassLoader将被丢弃并创建一个新的ClassLoader。这种方法意味着应用程序重新启动会比较快,因为基类加ClassLoader已经可用并且不会重新启动。
pom.xml配置
pom.xml引入spring-boot-devtools依赖
org.springframework.boot spring-boot-devtools true
pom.xml的plugins节点增加spring-boot maven插件配置
org.springframework.boot spring-boot-maven-plugin true
热部署配置
在application.yml的spring节点增加以下配置
spring: devtools: restart: enabled: true # 热部署开关,false即不启用 exclude: static/**,public/**,templates/** # 排除指定目录 additional-paths: src/main/java # 指定热部署目录
配置项说明如下:
enabled:热部署启用开关,true:启用;false:不启用。 exclude:配置不触发热部署的目录,也就是该目录下的文件修改不会导致restart。 additional-paths:指定热部署的目录,如该目录的文件内容修改了,会自动restart。这里配置的热部署目录是java类文件所在路径,将静态资源下的目录排除,也就是只有src/main/java目录下的文件修改才会触发热部署,其它目录修改都不会触发热部署。如果静态资源是放在resources目录下的话,最好还是放在additional-paths中,否则修改了静态资源文件也不会触发热部署。
如果是使用Thymeleaf模板引擎的话,需要将缓存去年,否当修改了视图页面的话,刷新页面也不会生效,这是因为spring boot中对模板引擎编译结果进行了缓存。在application.yml增加如下配置,即可去掉缓存:spring: thymeleaf: cache: false
Idea配置
修改了代码需要编译后才会生效,idea默认是不开启自动编译选项,需要手工开启自动编译,开启方式如下:
File->Settings->Build,Execution,Deployment->Compiler 将Build project automatically选项勾选上。 当应用是在running或者debugging模式下运行时,开启了该选项还不能自动编译,还需要修改Registry,通过Ctrl+Shift+Alt+/快捷键,打开Registry. 在Registry配置界面找到compiler.automake.allow.when.app.running配置项,将其value勾选上。基于Jrebel的热部署
虽然说基于spring-boot-devtools的热部署方案可以解决掉手动重启的麻烦,也比手动重启快的多,但是毕竟也要重新加载全部的应用代码,还是觉得比较耗时。这里再介绍另一种方案,使用Jrebel工具。
Idea安装方式: 1、离线安装:Idea的Jrebel插件地址: 2、在线安装:在idea插件管理搜索jrebel,在线安装。 安装后重启Idea,在工具栏中看到下图中这几个图标说明已经安装成功。 Jrebel和Idea一样,也提供两种启动模式,Run和Debug模式。使用了Jrebel工具启动应用的话,就会禁掉spring-boot-devtools。在Idea中修改类文件或者静态资源文件,直接按“Ctrl+F9”,Jrebel就会重新加载修改的类文件,然后刷新浏览器就可看到修改的代码已生效。Jrebel只重新加载修改过的类文件,没有修改的类不会重新加载,比spring-boot-devtools重新加载快的多。