之前的文章里写过idea下的热部署插件JRebel,其实在开发springboot的时候还有很多,今天再分享另一种方式spring自带的工具devtools。接下来就来看看这个怎么实现热部署。
1、首先在pom.xml文件里添加依赖。这个optional设置为true,表示当前项目依赖devtools,而依赖当前项目的项目如果项目使用devtools,需要重新添加,这个依赖关系不能传导。
- 当我们再次启动的时候,使用的加载器就变为了 restartedMain 了,说明热部署已经成功。
2、属性文件application.properties添加devtools配置,spring.devtools.restart.enabled表示的就是该热部署工具是否生效,spring.devtools.restart.additional-paths表示监控的目录,只有这个目录下的class发生改变,项目才会重启,最后一个更新不重启,一般配置的都是页面文件目录(
- 某些资源在更改时不一定需要触发重新启动。例如, Thymeleaf 模板可以就地进行编辑。默认情况下更改资源路径包括了:
/META-INF/maven
,/META-INF/resources
,/resources
,/static
,/public
或者/templates
不会触发重新启动, 但会触发实时重新加载。如果逆向排除这些路径,可以使用如下配置:spring.devtools.restart.exclude=static/**,public/**
)。
3、配置好以后,就可以写个例子验证一下热部署是否生效了 。
4、这个是修改前的返回值,修改controller里的参数后,发现项目确实重启了,但是修改项并没有生效,热部署时并没有把修改的class类给加载上。怀疑是自己idea没有编译类文件。红框范围里要打勾。
仍然没有生效,第二处检查Shift+Ctrl+Alt+/,弹窗选择Registry项,红框打勾。
再重启再修改,哈哈可以了,杰克马666出来啦!
5、devtools的重启速度快,这个和其原理是有关系的,它监听了路径下的文件变动,重启的时候只是加载有变动的class,不重新加载第三方的jar包。如果有三方包的变化还是要手动重启加载的。
- 由于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重启速度快的原因。
6、增加触发器文件触发重启
如果每个java源代码,随便改点东西,就频繁自动编译、重新加载,开销很大,此时可以加入触发器文件,Devtools 检测到触发器文件变更时才会触发重启检查。
- 通过spring.devtools.restart.trigger-file配7置触发器文件路径
7.自定义重启类加载器
如上所述,重启功能是通过使用两个类加载器实现的。 对于大多数应用程序,此方法运行良好,但有时可能会导致类加载问题。
默认情况下,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