spring boot 热部署
可以让spring boot不需要重启服务端,即可应用代码的改变。
一、什么是热部署?
在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class
文件,这个文件里记录着和代码等对应的各种信息,然后Class
文件将被虚拟机的ClassLoader
加载。
而热部署正是利用了这个特点,它监听到如果有Class
文件改动了,就会创建一个新的 ClassLoader
进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前。
这里要区分清楚。如果没有热部署,我们改动了代码之后(比如增加了一个方法),如果想让其生效,就要手动重启服务器,重新部署代码,把java类加载到jvm中,才能使用改动的部分。热部署则是不重启服务器,只是创建一个新的ClassLoader加载改动了的这个类,之后将其加载到jvm中,就可以使用了。
二、实现热部署
1.使用spring-boot-devtools(推荐)
pom.xml
1 2 3 4 5 6 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>1.4.3.RELEASE</version> <optional>true</optional> //注意,这里要配置true,才能启用热部署 </dependency> |
配置之后,只要代码有改动,就可以进行热部署。超级好用,强力推荐。
2.使用springloaded(比较麻烦,需要mvn打包)
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<build> <finalName>springboot</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.6.RELEASE</version> </dependency> </dependencies> </plugin> </plugins> </build> |
需要使用mvn clean packagespring-boot:repackage打包,
然后进入项目的pom.xml文件所在目录,使用mvn clean spring-boot:run命令,在cmd窗口启动项目,热加载才能生效。
如果直接Run As Application/Spring Boot App是没有效果的。
三、使用注意
由于热部署的时候是产生了新的类加载器,把更变过的类加载到jvm中,而不是重新部署,把这个更变了的类重新加载,所以在jvm中可能会同时存在两个类。
举个例子:
代码中只有一个testController
类,但是虚拟机中会存在两个testController,虽然是同一个Class
文件,但是这两个testController是相互独立的(一个变更过,一个没有变更)。所以在这种情况下使用instanceof(即testController instanceof testController)很可能出现false的结果。
四、总结
感觉热加载是个方便开发和部署的东西。如果正确使用,感觉会很方便哦。