SpringBoot:spring-boot-devtools在idea中实现热部署

springBoot对调试支持很好,修改之后可以实时生效

1.修改pom文件


	org.springframework.boot
	spring-boot-devtools
	true

spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是热部署。该模块在完整的打包环境下运行的时候会被禁用。如果你使用 java -jar启动应用或者用一个特定的 classloader 启动,它会认为这是一个“生产环境”。

 

当配置了 devtools 后,我们在classpath修改任何文件项目都将会自动重启。

  • 某些资源在更改时不一定需要触发重新启动。例如, Thymeleaf 模板可以就地进行编辑。默认情况下更改资源路径包括了:/META-INF/maven/META-INF/resources ,/resources ,/static ,/public 或者 /templates 不会触发重新启动, 但会触发实时重新加载。如果逆向排除这些路径,可以使用如下配置:spring.devtools.restart.exclude=static/**,public/**
  • 如果要保留这些默认值并添加其他排除项, 请使用 spring.devtools.restart.additional-exclude 属性代替。
  • 通过 System.setProperty("spring.devtools.restart.enabled", "false"); 方法,可以在SpringApplication.run()方法运行天使用关闭 devtools。
  • 由于spring-boot-devtools采用的双类加载器机制:base类加载器(base ClassLoader), restart类加载器(restart ClassLoader),重启过程会比较快
    • base ClassLoader:用于加载不会改变的jar(eg.第三方依赖的jar)
    • restart ClassLoader:用于加载我们正在开发的jar(eg.整个项目里我们自己编写的类)。当应用重启后,原先的restart ClassLoader被丢掉、重新new一个restart ClassLoader来加载这些修改过的东西,而base ClassLoader却不需要动一下。这就是devtools重启速度快的原因。
  • 当我们再次启动的时候,使用的加载器就变为了 restartedMain 了,说明热部署已经成功。

SpringBoot:spring-boot-devtools在idea中实现热部署_第1张图片

2.修改idea配置

当我们修改了java类后,IDEA默认是不自动编译的,而spring-boot-devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译

(1)“File” -> “Settings” -> “Build,Execution,Deplyment” -> “Compiler”,选中打勾 “Build project automatically” 。

SpringBoot:spring-boot-devtools在idea中实现热部署_第2张图片
(2) 组合键:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾 “compiler.automake.allow.when.app.running” 。

SpringBoot:spring-boot-devtools在idea中实现热部署_第3张图片

如果idea快捷键做过变更的话,可以通过“File” -> “Settings” ->“KeyMap” 搜索Maintenance找到对应的快捷键

SpringBoot:spring-boot-devtools在idea中实现热部署_第4张图片

 

3.增加触发器文件触发重启

如果每个java源代码,随便改点东西,就频繁自动编译、重新加载,开销很大,此时可以加入触发器文件,Devtools 检测到触发器文件变更时才会触发重启检查。

  • 通过spring.devtools.restart.trigger-file配置触发器文件路径

4.自定义重启类加载器

如上所述,重启功能是通过使用两个类加载器实现的。 对于大多数应用程序,此方法运行良好,但有时可能会导致类加载问题。

默认情况下,IDE中的任何打开的项目都会使用“restart”类加载器加载,任何常规.jar文件将使用“base”类加载器加载。 如果你在多模块项目上工作,但不是每个模块都导入到IDE中,则可能需要自定义配置。 为此,你可以创建一个META-INF/spring-devtools.properties文件。

spring-devtools.properties文件可以包含restart.exclude. 和restart.include. 前缀的属性。 include元素是应该被放入“restart”类加载器的项目, exclude元素是应该放入“base”类加载器的项目。 属性的值是应用于类路径下的正则表达式。

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

 

你可能感兴趣的:(SpringBoot学习笔记)