热部署
所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。
对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。—— [ 百度百科 ]
类加载机制
Java 中的.Java
类文件都是经过编译器然后把代码编译为存储字节码的 .Class
文件,这个编译后的.Class
文件就包含了各种信息,之后便是要加载到JVM
虚拟机中运行使用。
虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。——摘自《深入理解 Java 虚拟机》
Spring Boot 热部署
Spring Boot 官网给我提供了一个spring-boot-devtools这个工具jar包,而我们只许把这个jar宝引入项目就可以完成热部署。
修改项目pom.xml文件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 必须修改为true,默认是false --> <!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 --> </dependency>
测试实现
重新编译修改java类文件
双类加载器机制
当我们修改了一个java类(不止是业务逻辑,包括修改、添加、删除方法以及修改接口名称)的时候,在重新编译后项目classpath文件下的.class
文件后,Spring Boot的就会快速重启。因为devtools这个工具包会监听classpath下的文件变动,所以当java类重新编译的时候,devtools会监听到这个变化,然后就会重新启动SpringBoot。这个重启是非常快的一个过程。因为在SpringBoot中有两个类加载器,一个是加载工程外部资源的,如jar包,还有一个类加载器是用来加载本工程的class的。所以此时在重启SpringBoot的时候只加载本工程的class文件。
项目启动用时:2.325秒
修改编译自动启动用时:0.739秒
修改页面文件html OR jsp
页面修改后会立即生效,刷新即可。
监听修改文件夹选择重启
devtools工具包还可以监听文件夹的变化,从而人为控制修改相应的文件才会重启项目。
#添加那个目录的文件需要restart
spring.devtools.restart.additional-paths=src/main/java/*
#排除那个目录的文件不需要restart
spring.devtools.restart.exclude=static/*
来自:http://m.blog.csdn.net/m0_37995707/article/details/77379304