写点什么

【Spring Boot 13】实现热部署,最新 Java 通用流行框架大全

用户头像
极客good
关注
发布于: 刚刚

这种方式是右键运行启动类


首先先下载对应的 springloaded-1.2.6.RELEASE.jar,可以去上面提到的官网获取


博主这里直接引用 maven 依赖已经下载好的路径哈


然后打开下图所示的 Edit Configurations 配置,在 VM options 中输入:


-javaagent:C:\Users\tengj.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify



然后直接右键运行启动类即可启动项目。


上面 2 种方式小伙伴随便选择一种即可,当系统通过 mvn spring-boot:run 启动或者 右键 application debug 启动 Java 文件时, 系统会监视 classes 文件,当有 classes 文件被改动时,系统会重新加载类文件,不用重启服务。


idea 中需要重新编译文件 Ctrl+Shift+F9 或者编译项目 Ctrl+F9。


如何测试热部署是否可用呢,你可以先写个简单的 Controller 方法,返回个字符串,然后启动项目,接着修改下这个方法返回的字符串,Ctrl+Shift+F9 编译下当前类,然后再刷新下页面看看是否内容改变了。


在 Spring Boot,模板引擎的页面默认是开启缓存,如果修改页面内容,刷新页面是无法获取修改后的页面内容,所以,如果我们不需要模板引擎的缓存,可以进行关闭。


spring.freemarker.cache=false


spring.thymeleaf.cache=false


spring.velocity.cache=false


经过博主简单的测试,发现大多数情况可以使用热部署,有效的解决了文章头部中提到的那个痛点,不过还是有一些情况下需要重新启动,不可用的情况如下:


(1)对于一些第三方的注解修改不能自动加载,比如 spring mvc 的 @RequestMapping


(2)application.properties 的修改也不行


(3)log4j 的配置文件的修改不能即时生效



(二)spring-boot-devtools 实现热部署




spring-boot-devtools 为应用提供一些开发时特性,包括默认值设置,自动重启,livereload 等。

1、pom 依赖

想要使用 devtools 热部署功能,maven 添加依赖如下:


<dependencies>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-devtools</artifactId>


<optional>true</optional>


</dependency>


</dependencies>


将依赖关系标记为可选<optional>true</optional>是一种最佳做法,可以防止使用项目将 devtools 传递性地应用于其他模块。

2、默认属性

在 spring boot 继承 thymeleaf 时,spring.thymefeaf.cache 属性设置为 false 可以禁用模板引擎编译的缓存结果。


现在,devtools 会自动帮你做到这些,禁用所有模板的缓存,包括 Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache 等。

3、自动重启

自动重启的原理在于 spring boot 使用两个 classloader:不改变的类(如第三方 jar)由 base 类加载器加载,正在开发的类由 restart 类加载器加载。应用重启时,restart 类加载器被扔掉重建, 而 base 类加


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


载器不变,这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为 base 类加载器已经可用并已填充。


所以,当我们开启 devtools 后,classpath 中的文件变化会导致应用自动重启。


当然不同的 IDE 效果不一样,eclipse 中保存文件即可引起 classpath 更新,从而出发重启。而 idea 则需要自己手动 Ctrl+F9 重新编译一下。


(1)排除静态资源文件


静态资源文件在改变之后有时候没必要触发应用程序重启,例如 thymeleaf 模板文件就可以实时编辑,默认情况下,更改 /META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates 下 的资源不会触发重启,而是触发 live reload(devtools 内嵌了一个 liveReload server,当资源发生改变时,浏览器刷新,下面会介绍)。


可以使用 spring.devtools.restart.exclude 属性配置,例如


spring.devtools.restart.exclude=static/,public/


如果想保留默认配置,同时增加新的配置,则可使用


spring.devtools.restart.additional-exclude 属性


(2)观察额外的路径


如果你想观察不在 classpath 中的路径的文件变化并触发重启,则可以配置 spring.devtools.restart.additional-paths 属性。


不在 classpath 内的 path 可以配置 spring.devtools.restart.additionalpaths 属性来增加到监视中,同时配置 spring.devtools.restart.exclude 可以选择这些 path 的变化是导致 restart 还是 live reload。


(3)关闭自动重启


设置 spring.devtools.restart.enabled 属性为 false,可以关闭该特性。可以在 application.properties 中设置,也可以通过设置环境变量的方式。


public static void main(String[] args) {


System.setProperty("spring.devtools.restart.enabled", "false");


SpringApplication.run(MyApp.class, args);


}


(4)使用一个触发条件


若不想每次修改都触发自动重启,可以设置 spring.devtools.restart.trigger-file 指向某个文件,只有更改这个文件时才触发自动重启。


(5)自定义自动重启类加载器


默认情况下,IDE 中打开的项目都会由 restart 加载器加载,jar 文件由 base 加载器加载,但是若你使用 multi-module 的项目,并且不是所有模块都被导入 IDE 中,此时会导致加载器不一致。这时你可以创建 META-INF/spring-devtools.properties 文件, 并增加 restart.exclude.XXX,restart.include.XXX 来配置哪些 jar 被 restart 加载,哪些被 base 加载。如:


restart.include.companycommonlibs=/mycorp-common-[\w-]+.jar


restart.include.projectcommon=/mycorp-myproj-[\w-]+.jar

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【Spring Boot 13】实现热部署,最新Java通用流行框架大全