热部署是什么
大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的 Class 文件,这个文件里记录着和代码等对应的各种信息,然后 Class 文件将被虚拟机的 ClassLoader 加载。
而热部署正是利用了这个特点,它监听到如果有 Class 文件改动了,就会创建一个新的 ClaassLoader 进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前。
类加载机制
Java 中的类经过编译器可以把代码编译为存储字节码的 Class 文件,该 Class 文件存储了各种信息,最终要加载到虚拟机中运行使用。
类加载机制(摘自《深入理解 Java 虚拟机》)
虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。
Spring Boot 实现热部署
Spring Boot 实现热部署很简单,我们使用上一章创建的项目 Springboot 创建简单的 web 交互应用 来演示。
- 使用 Spring Loaded
- 使用 spring-boot-devtools
第一种方式 略
着重介绍在IDEA中实现spring boot 的热部署:
1.导入依赖包(最好在建项目时 勾选上core-devTools)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <!--
<optional>true</optional> 依赖包不传递,假如该包在父pom中,如果其他子项目需要使用热部署的依赖包,还必须需要导入
--> <optional>true</optional> </dependency>
2.加入编译节点(在springboot中已经有了spring-boot-maven-plugin,所以直接加入configuration标签内的内容即可)
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration>
<!-- 如果没有该配置,这个devtools不会起作用,即应用不会restart--> <fork>true</fork> </configuration> </plugin> </plugins> </build>
3. 修改配置,实现idea自动编译
3.1 Settings-complier- build project automatically --> 勾选
3.2、CTRL + SHIFT + A --> 在出现的对话框中输入 : registry --> 找到并勾选compiler.automake.allow.when.app.running
4. 编写测试方法
4.1 修改返回值
4.2 增加方法,测试是否可以正确访问新的方法
4.3 增加新的测试类,测试是否可以正确访问
5. 说明:
<optional>true</optional> 表示该依赖是否传递(true 表示可以传递)
如 该依赖在父pom中,并且有该<optional>true</optional>设置,其子module会实现自动部署。----这个与该配置无关,改成false还是会自动部署,因为这个是父子程序的原因。