开发时如果不能实现热部署其实是件挺坑爹的事情,每次修改点东西还必须要手动重启,也影响开发效率和进度。
下面就说下在Idea中依托maven项目怎么实现热部署
第一:快捷键CTRL + SHIFT + A,输入 make project automatically,进入后勾选此选项,确定并推出。
第二:CTRL + SHIFT + A,输入Registry,找到并勾选compiler.automake.allow.when.app.running,直接关闭即可
第三:在项目中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
添加插件支持:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
按照以上步骤已经可以实现项目在修改后会自动重启了,特别指出,在修改类文件和配置文件后,应用会重启,修改页面并不会让应用重启,但是会应用最新的修改。
默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载,这是应为devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新
也可指定重启的目录,哪些目录文件修改重启以及排除修改重启
#开启热部署
spring.devtools.restart.enabled= true
#设置重启的目录
spring.devtools.restart.additional-paths= src/main/java
#设置文件修改不重启,相对于classpath
spring.devtools.restart.exclude= WEB-INF/**
其原理是使用了多个ClassLoader,devtools监听文件的改动,发现有更改后即会重新创建一个ClassLoader替换之前的ClassLoader,我们从启动日志信息里也可看出来。
可以看出,使用devtools后启动线程名称从main变为restartedMain,而且还使用LiveReload server来实现重新加载