我们每次代码修改,更改配置信息,升级软件的时候,需要重新启动服务进行测试、验证,这不仅浪费时间和精力,而且每次重启服务影响他人使用?热部署可以帮我们轻松解决这些问题!
热部署的概念
热部署就是在程序软件运行过程中,当修改代码或者软件升级的时候,不需要重启服务,可以自动重新加载运行。当代码变化时,它能快速的反馈给我们。
SpringBoot实现热部署的原理
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
SpringBoot项目实现热部署(IDEA)
SpringBoot包含一个额外的应用可以让开发工作更加便捷高效。
spring-boot-devtools module可以在任一项目中提供便利。为了获得 devtools的支持,我们需要在项目中添加 module dependency,下面列出了Maven 和Gradle的,你可以根据项目需要进行选择。
MAVEN
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
IDEA中对配置进行修改
第一步: 选择自动编译(这里只在程序不运行或者DEBUG时有用)
Eclipse中自动编译;IDEA中不自动编译,需要我们启动服务器时才编译,所以在IDEA中·,我们就需要自己将自动编译勾选。
打开顶部工具栏 File -> Settings -> Build、Execution、Deployment-> Compiler 然后勾选 Build project automatically
第二步: 选择自动编译(服务运行中有用)
同时按住 Ctrl + Shift + Alt + / 然后进入Registry
然后找到compiler.automake.allow.when.app.running,在程序运行中自动编译
到这里,我们就完成了所有的配置。
但这并不意味着,我们修改代码时,热部署会一直将代码自动编译。因为只有我们离开开发工具,打开其他应用,如浏览器,测试工具的时候,restart开始工作。
我们可以在IDEA前打开浏览器,来验证自己设置的热部署的自动编译是否成功。
在实际的项目中,我们并不需要全部的文件都进行热部署的自动编译,例如确定的资源
/META-INF/maven
,/META-INF/resources
,/resources
,/static
,/public
,和/templates
,这时我们可以将不需要的文件,进行忽略。把自己需要忽略的文件路径写下即可。
spring.devtools.restart.exclude=static/**,public/**