Spring boot热部署配置[转]

Spring boot热部署配置

转自https://www.zybuluo.com/weiys/note/1141626


使用spring boot时,修改类文件或资源文件时,需要重新启动应用才生效,而且一般应用重启消耗时间比较长,非常影响开发效率。这里提供了两种方案解决应用热部署的问题。

  1. 使用spring-boot-devtools模块
  2. 使用Jrebel工具
 

基于spring-boot-devtools的热部署

spring-boot-devtools是spring为开发者提供的支持spring boot应用热部署的模块,以提高开发效率,它的实现原理是提供两个ClassLoader,一个基类ClassLoader用于加载不改变的类(如第三方jar包),另一个重启类ClassLoader用于加载应用中会变化的Class。当应用程序重新启动时,重启动类ClassLoader将被丢弃并创建一个新的ClassLoader。这种方法意味着应用程序重新启动会比较快,因为基类加ClassLoader已经可用并且不会重新启动。 
spring-boot-devtools官方说明

 

pom.xml配置

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节点增加以下配置

    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.png-5.2kB 
在Registry配置界面找到compiler.automake.allow.when.app.running配置项,将其value勾选上。 
Registry2.png-36kB

 

基于Jrebel的热部署

虽然说基于spring-boot-devtools的热部署方案可以解决掉手动重启的麻烦,也比手动重启快的多,但是毕竟也要重新加载全部的应用代码,还是觉得比较耗时。这里再介绍另一种方案,使用Jrebel工具。 
Idea安装方式: 
1、离线安装:Idea的Jrebel插件地址:Jrebel插件下载 
2、在线安装:在idea插件管理搜索jrebel,在线安装。 
Jebel插件.png-44kB 
安装后重启Idea,在工具栏中看到下图中这几个图标说明已经安装成功。 
Jrebel.png-4.1kB 
Jrebel和Idea一样,也提供两种启动模式,Run和Debug模式。使用了Jrebel工具启动应用的话,就会禁掉spring-boot-devtools。在Idea中修改类文件或者静态资源文件,直接按“Ctrl+F9”,Jrebel就会重新加载修改的类文件,然后刷新浏览器就可看到修改的代码已生效。

Jrebel只重新加载修改过的类文件,没有修改的类不会重新加载,比spring-boot-devtools重新加载快的多。

原文地址:https://www.cnblogs.com/awei4home/p/9171757.html