springboot 在idea中使用热部署
devtools:是spring boot的一个热部署工具,当修改了classpath下的文件(包括类文件、属性文件、页面等)时,会重新启动应用(由于其采用的双类加载器机制,这个启动会非常快,如果发现这个启动比较慢,可以选择使用jrebel)
双类加载器机制:boot使用了两个类加载器来实现重启(restart)机制:base类加载器+restart类加载器。
base类加载器:用于加载不会改变的jar(第三方依赖的jar)
restart类加载器:用于加载我们正在开发的jar(整个项目里我们自己编写的类)。当应用重启后,原先的restart类加载器被丢掉、重新new一个restart类加载器来加载这些修改过的东西,而base类加载器却不需要动一下。
1.在pom.xml文件中加入以下代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2.idea中File-》Settings-》Build,Execution,Deployment-》Compiler
勾选Build project automatically
3.按ctrl+alt+shift+/ 选择Registry 勾选
4. Chrome禁用缓存
F12或者“Ctrl+Shift+I”,打开开发者工具,“Network” 选项卡下 选中打勾 “Disable Cache(while DevTools is open)”
不能使用分析:
(a) 对应的spring-boot版本是否正确;
(b) 是否加入spring-boot-maven-plugin,以及属性<fork>true</fork>
(c) Eclipse Project 是否开启了Build Automatically
(d) 如果设置SpringApplication.setRegisterShutdownHook(false),则自动重启将不起作用。
补充:
1、默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。
2、如果想改变默认的设置,可以自己设置不重启的目录:spring.devtools.restart.exclude=static/**,public/**,这样的话,就只有这两个目录下的文件修改不会导致restart操作了。
3、如果要在保留默认设置的基础上还要添加其他的排除目录:spring.devtools.restart.additional-exclude
4、如果想要使得当非classpath下的文件发生变化时应用得以重启,使用:spring.devtools.restart.additional-paths,这样devtools就会将该目录列入了监听范围。
关闭自动重启
设置 spring.devtools.restart.enabled 属性为false,可以关闭该特性。可以在application.properties中设置,也可以通过设置环境变量的方式。
System.setProperty("spring.devtools.restart.enabled","false");
SpringApplication.run(MyApp.class, args);