JavaWeb日记——Springboot 热部署的两种方式
2016-12-28 20:14
555 查看
本文转自 https://huanxi.pub/2016/12/26/springboot%E7%83%AD%E9%83%A8%E7%BD%B2/
Springboot 实现热部署的两种方式
而热部署正是利用了这个特点,它监听到如果有
类加载机制(摘自《深入理解 Java 虚拟机》)
虚拟机把描述类的数据从
使用 Spring Loaded
使用
添加完毕,启动项目
Note
这次启动不能直接运行
然后还是使用
如果我们想指定让
这里要特别注意下,由于热部署是监听
所以,如果你使用
如图打钩即可。
由于热部署的时候是产生了新的类加载器,我们的一个类可能在虚拟机中存在两个类,比如代码中就一个
由于第一次使用热部署,一开始遇到个很奇怪的问题,
如果有遇到类似问题的朋友,可以检查下是不是由于不同的
Springboot 实现热部署的两种方式
热部署
在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class文件,这个文件里记录着和代码等对应的各种信息,然后
Class文件将被虚拟机的
ClassLoader加载。
而热部署正是利用了这个特点,它监听到如果有
Class文件改动了,就会创建一个新的
ClaassLoader进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前。
类加载机制
Java中的类经过编译器可以把代码编译为存储字节码的
Class文件,该
Class文件存储了各种信息,最终要加载到虚拟机中运行使用。
类加载机制(摘自《深入理解 Java 虚拟机》)
虚拟机把描述类的数据从
Class文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的
Java类型。
Spring Boot 实现热部署
Spring Boot 实现热部署很简单,我们使用上一章创建的项目 Springboot 创建简单的 web 交互应用 来演示。使用 Spring Loaded
使用
spring-boot-devtools
springloaded
在 POM 文件中添加依赖123456789101112131415 | <build> <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> |
Note
这次启动不能直接运行
main方法了,需要使用
mvn spring-boot:run启动,然后随意在代码中写一个
System.out.println("Hi"),再次调用那个方法,会发现控制台会打印出
Hi。
spring-boot-devtools
添加 POM 文件依赖12345 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 这个需要为 true 热部署才有效 --></dependency> |
mvn spring-boot:run启动项目,随意更改代码即可看到效果。
如果我们想指定让
devtools监听指定文件夹,那么可以在
application.yml配置
spring.devtools.restart.additional-paths=your path,注意这里需要改成
yml文件的格式。
Important(特别注意)
可能会有同学按照以上方法处理了都无效。这里要特别注意下,由于热部署是监听
Class文件的变化,它自身不会主动去编译
Java文件,所以我们得在
Java文件改动时,自动编译成
Class文件,然后热部署工具创造的新的类加载器才会加载改变后的
Class文件。
所以,如果你使用
IDEA开发工具的话,记得要把自动编译打开。
如图打钩即可。
由于热部署的时候是产生了新的类加载器,我们的一个类可能在虚拟机中存在两个类,比如代码中就一个
User类,但是虚拟机中会存在两个
User,虽然是同一个
Class文件,但是却是两个独立的类,这个要清楚。
由于第一次使用热部署,一开始遇到个很奇怪的问题,
A instanceof A == false,明明两个
A.getClass()都一样,但结果就是
false,还问了几个朋友,表示都没遇到,后来当我把
devtools依赖注释后,才正确执行。
如果有遇到类似问题的朋友,可以检查下是不是由于不同的
ClassLoader造成的。
接下来要了解的
本系列所有代码已同步到GitHub, 项目地址 github:sboot-learn,欢迎 star ,如有问题,还请留言。
相关文章推荐
- 基于Maven的SpringBoot项目实现热部署的两种方式
- 基于Maven的SpringBoot项目实现热部署的两种方式
- Springboot 热部署的两种方式
- Spring Boot 实现热部署两种方式
- 基于Maven的SpringBoot项目实现热部署的两种方式
- spring-boot自动部署的两种方式
- springboot 热部署的两种方式
- SpringBoot之——热部署的两种方式
- 基于Maven的SpringBoot项目实现热部署的两种方式
- Spring-boot中读取config配置文件的两种方式
- 多种方式解决spring boot swagger ui使用 nginx 部署后无法使用问题
- spring boot 两种方式注入到静态工具类里面
- 详解Spring-boot中读取config配置文件的两种方式
- Spring Boot 注解启动的两种方式
- 3.Spring Boot + Security初步使用(覆盖配置的两种方式 配置类和XML注入以自定义页面为例)
- spring boot与thymeleaf页面传参两种方式
- springBoot 多环境执行部署方式
- 关于给springboot添加定时器的两种方式
- 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】
- java web项目 maven springboot 框架 以jar方式如何部署到服务器上