Springboot 热部署的两种方式
2017-06-11 16:09
691 查看
在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的 Class 文件,这个文件里记录着和代码等对应的各种信息,然后 Class 文件将被虚拟机的 ClassLoader 加载。
而热部署正是利用了这个特点,它监听到如果有 Class 文件改动了,就会创建一个新的 ClaassLoader 进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前。
第一种配置在编写代码的时候,你会发现我们只是简单把打印信息改变了下,就需要重新部署,如果是这样的编码方式,那么我们估计一天下来之后就真的是打几个Hello World之后就下班了。那么如何解决热部署的问题呢?那就是springloaded,加入如下配置:
如果使用的run as – java application的话,那么还需要做一些处理哦:
把spring-loader-1.2.4.RELEASE.jar下载下来,放到项目的lib目录中,然后把IDEA的run参数里VM参数设置为:
-javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify
然后启动就可以了,这样在run as的时候,也能进行热部署了。
当然并不是所有的代码都支持热部署了,这个我自己也不是很明确,那些代码修改了可以直接不用重启查看。
第二种:spring-boot-devtools添加 POM 文件依赖
如果我们想指定让 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, 项目地址
springboot-study,欢迎 star ,如有问题,还请留言。
如果觉得我的文章或者代码对您有帮助,可以微信打赏请我喝杯咖啡。
您的支持将鼓励我继续创作!谢谢!
而热部署正是利用了这个特点,它监听到如果有 Class 文件改动了,就会创建一个新的 ClaassLoader 进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前。
类加载机制(摘自《深入理解 Java 虚拟机》) 虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的
Java 类型。
第一种配置在编写代码的时候,你会发现我们只是简单把打印信息改变了下,就需要重新部署,如果是这样的编码方式,那么我们估计一天下来之后就真的是打几个Hello World之后就下班了。那么如何解决热部署的问题呢?那就是springloaded,加入如下配置:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin </artifactId> <dependencies> <!--springloaded hot deploy --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.4.RELEASE</version> </dependency> </dependencies> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> </configuration> </execution> </executions> </plugin>如果是使用spring-boot:run的话,那么到此配置结束,现在你就可以体验coding…coding的爽了。
如果使用的run as – java application的话,那么还需要做一些处理哦:
把spring-loader-1.2.4.RELEASE.jar下载下来,放到项目的lib目录中,然后把IDEA的run参数里VM参数设置为:
-javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify
然后启动就可以了,这样在run as的时候,也能进行热部署了。
当然并不是所有的代码都支持热部署了,这个我自己也不是很明确,那些代码修改了可以直接不用重启查看。
第二种:spring-boot-devtools添加 POM 文件依赖
<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, 项目地址
springboot-study,欢迎 star ,如有问题,还请留言。
如果觉得我的文章或者代码对您有帮助,可以微信打赏请我喝杯咖啡。
您的支持将鼓励我继续创作!谢谢!
相关文章推荐
- JavaWeb日记——Springboot 热部署的两种方式
- 基于Maven的SpringBoot项目实现热部署的两种方式
- 基于Maven的SpringBoot项目实现热部署的两种方式
- springboot 热部署的两种方式
- 基于Maven的SpringBoot项目实现热部署的两种方式
- SpringBoot之——热部署的两种方式
- 基于Maven的SpringBoot项目实现热部署的两种方式
- spring-boot自动部署的两种方式
- Spring Boot 实现热部署两种方式
- Spring boot 整合Swagger的两种方式
- springBoot 多环境执行部署方式
- spring boot与thymeleaf页面传参两种方式
- 3.Spring Boot + Security初步使用(覆盖配置的两种方式 配置类和XML注入以自定义页面为例)
- Spring-boot中读取config配置文件的两种方式
- 详解Spring-boot中读取config配置文件的两种方式
- spring boot 两种方式注入到静态工具类里面
- 多种方式解决spring boot swagger ui使用 nginx 部署后无法使用问题
- SpringBoot通过jar包方式centos后台部署,如何做到退出控制台,链接访问有效
- spring-boot dubbo项目使用docker方式部署
- Spring Boot中防止递归查询的两种方式