转自https://www.zybuluo.com/weiys/note/1141626html
使用spring boot时,修改类文件或资源文件时,须要从新启动应用才生效,并且通常应用重启消耗时间比较长,很是影响开发效率。这里提供了两种方案解决应用热部署的问题。java
spring-boot-devtools是spring为开发者提供的支持spring boot应用热部署的模块,以提升开发效率,它的实现原理是提供两个ClassLoader,一个基类ClassLoader用于加载不改变的类(如第三方jar包),另外一个重启类ClassLoader用于加载应用中会变化的Class。当应用程序从新启动时,重启动类ClassLoader将被丢弃并建立一个新的ClassLoader。这种方法意味着应用程序从新启动会比较快,由于基类加ClassLoader已经可用而且不会从新启动。
spring-boot-devtools官方说明spring
pom.xml引入spring-boot-devtools依赖浏览器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
pom.xml的plugins节点增长spring-boot maven插件配置缓存
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork><!--fork配置为true,devtools才会生效 --> </configuration> </plugin>
在application.yml的spring节点增长如下配置app
spring: devtools: restart: enabled: true # 热部署开关,false即不启用 exclude: static/**,public/**,templates/** # 排除指定目录 additional-paths: src/main/java # 指定热部署目录
配置项说明以下:
enabled:热部署启用开关,true:启用;false:不启用。
exclude:配置不触发热部署的目录,也就是该目录下的文件修改不会致使restart。
additional-paths:指定热部署的目录,如该目录的文件内容修改了,会自动restart。maven
这里配置的热部署目录是java类文件所在路径,将静态资源下的目录排除,也就是只有src/main/java目录下的文件修改才会触发热部署,其它目录修改都不会触发热部署。若是静态资源是放在resources目录下的话,最好仍是放在additional-paths中,不然修改了静态资源文件也不会触发热部署。
若是是使用Thymeleaf模板引擎的话,须要将缓存去年,否当修改了视图页面的话,刷新页面也不会生效,这是由于spring boot中对模板引擎编译结果进行了缓存。在application.yml增长以下配置,便可去掉缓存:ide
spring: thymeleaf: cache: false
修改了代码须要编译后才会生效,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勾选上。 spring-boot
虽说基于spring-boot-devtools的热部署方案能够解决掉手动重启的麻烦,也比手动重启快的多,可是毕竟也要从新加载所有的应用代码,仍是以为比较耗时。这里再介绍另外一种方案,使用Jrebel工具。
Idea安装方式:
一、离线安装:Idea的Jrebel插件地址:Jrebel插件下载
二、在线安装:在idea插件管理搜索jrebel,在线安装。
安装后重启Idea,在工具栏中看到下图中这几个图标说明已经安装成功。
Jrebel和Idea同样,也提供两种启动模式,Run和Debug模式。使用了Jrebel工具启动应用的话,就会禁掉spring-boot-devtools。在Idea中修改类文件或者静态资源文件,直接按“Ctrl+F9”,Jrebel就会从新加载修改的类文件,而后刷新浏览器就可看到修改的代码已生效。工具
Jrebel只从新加载修改过的类文件,没有修改的类不会从新加载,比spring-boot-devtools从新加载快的多。