在使用springboot项目开发过程中,我们会在本地不断地修改代码,然后不断地重启tomcat实现项目的重新发版,这个过程占用了我们很大的时间,所以我们今天来讲一下如何实现热部署(就是改了代码它会自动重启,不用我们手动重启)
一、在pom文件中添加如下配置:
1.在<dependencies></dependencies>中添加:
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2.在<plugins></plugins>中添加:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 必须配置该项为true,fork : 如果没有该项配置,devtools不会起作用,即应用不会restart -->
<fork>true</fork>
</configuration>
</plugin>
spring-boot-maven-plugin插件创建项目后都会有,如果没有就加上,关键是加粗字体配置!
配置完了,就可以测试了,注意:改了代码项目不会立刻重启,需要等5S!!!
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
如果想要实现修改完代码立即重启,自定义能监测代码变化的目录(哪些代码修改了允许重启),忽略哪些代码改变不重启,作application.properties如下配置:
#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录
spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude: WEB-INF/**
什么时候才会触发上述配置项呢?当我们修改完代码保存的时候!
如果完成上述步骤后依然不能重启:
1.是否加入plugin了,以及属性<fork>true</fork>
2.如果使用工具IDEA,Intellij IDEA是否开启了Make Project Automatically
3.如果设置SpringApplication.setRegisterShutdownHook(false),则自动重启将不起作用,SpringApplication为启动类,具体可能名称不同。