在日常代码开发与调试过程中,频繁地修改代码并重新编译、启动SpringBoot工程以生效是常见的操作。但是有些项目非常庞大,启动时间可能长达几十秒甚至几分钟,这极大地降低了开发效率。为了解决这个问题,我们可以尝试使用热部署技术,以最短的时间使仅修改的部分生效。其实IDEA本身在使用Debug模式的情况下,是可以对一些简单的修改实现热部署效果的,但是稍微复杂的修改比如对配置文件,方法名称改变,增加类及方法进行热部署是无法生效的,所以其使用范围有限。接下来,让我们直接介绍多种更强大的热部署的具体实现方案。
方案一:Spring-boot-devtools组件
原理:spring-boot-devtools使用了两个类加载器ClassLoader,一个ClassLoader加载不会发生更改的类(第三方jar包),另一个ClassLoader(restart ClassLoader)加载会更改的类(自定义的类)。后台启动一个文件监听线程(File Watcher),监测的目录中的文件发生变动时,原来的restart ClassLoader被丢弃,将会重新加载新的restart ClassLoader。因为文件变动后,第三方jar包不再重新加载,只加载自定义的类,加载的类比较少,所以重启比较快。
- 第一步:修改pom文件,加入组件
<dependencies> <!-- devtools热部署依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- 防止将依赖传递到其他模块中 --> <optional>true</optional> <!-- 只在运行时起作用,打包时不打进去(防止线上执行打包后的程序,启动文件监听线程File Watcher,耗费大量的内存资源) --> <scope>runtime</scope> </dependency> </dependencies>
讯享网
- 修改配置文件
讯享网spring: devtools: restart: # 开启热部署(更改文件后,自动重启) enabled: true 设置哪些资源变动后不触发热部署,会覆盖默认的exclude内容(资源不会触发重启,但会触发实时重新加载) # exclude: WEB-INF/,static/ 监控额外的路径(优先于exclude) # additional-paths: src/main/java
这里其实不推荐所有环境都使用一套配置,而是在不同的环境使用properties文件分开,生产环境不要使用热部署机制,仅测试环境使用热部署,因为存在安全隐患
方案二:Jrebel插件
JRebel是一款非常优秀的热部署插件,当我们使用这个插件后,调试过程中,修改代码后不需要重新启动服务,只需要重新编译当前类或者编译整个项目即可使修改的部分生效。
这个插件是收费的,但是我们可以科学的使用它:
- 第一步,打开IDEA软件,打开插件下载页面,左上角File -> Settings -> Plugins,点击Install按钮下载下图所示插件,等待下载完成,因为插件比较大,可能会下载比较慢,稍微等一下。其实这里不推荐使用最新的版本,最好去官网下载比较旧的版本,新版本可能会激活失败,下载地址
https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions我使用的是2022.4.1是可以激活的

- 下载完成之后会弹出这个激活页面,点击下图箭头所示JRebel Activation进入激活

- 下图所示就是激活的具体页面,有几个文本框需要填写

- 进入这个网站
https://www.guidgen.com/获取一串GUID,复制这串GUID

- 复制之后替换以下url中的{GUID},替换后的样式为
https://jrebel.qekang.com/-653e-4f9e-ab7f-175d81e1be89
- url:https://jrebel.qekang.com/{GUID}
- 备用url:http://idea.javatiku.cn/{GUID}
- 复制替换后的url填入到激活页面的第一栏中,然后第二栏随便填写一个邮箱即可,最后点击Activate Jrebel按钮

- 激活成功之后,右上角会多出2个绿色的按钮,一个是启动,一个是调试

- 任意点击一个然后启动SringBoot项目,启动成功之后,修改某个类的代码,修改完成之后点击导航栏Build->Recompile该类重写加载之后,再调用接口或者方法查看返回结果,这个时候返回的结果是根据修改后的代码执行的。如果修改的类比较多,则直接选择Rebuild Project重写编译整个项目,可能时间会稍微久一点,但是也不需要重写启动整个项目了

在实际的使用过程中,JRebel能够覆盖绝大部分修改场景,包括类代码的修改,配置文件,国际化语言properties文件的修改等等。但是使用debug模式下,如果硬件配置一般的话,可能在点击调试相关的按钮,比如进入到下一行,下一个断点这种按钮时会有卡顿,甚至长时间没有反应。会比IDEA自带的debug模式性能要差一些,可能也跟热部署的内部实现机制有关,这个大家可以自己尝试一下。
方案三:HotSwapAgent+DCEVM
Java8方案
- 第一步:按照并配置好Java环境,我这里以JDK-8u181版本为例,这里给出一种下载JDK方式-华为云下载对应的JDK,有Windows安装的,也有Linux的JDK版本或者MacOS的。url:
https://repo.huaweicloud.com/java/jdk/8u181-b13/,下载系统对应的包配置好环境即可,JDK的环境配置,这里就不详细讲解了,网上有很多的教程。 - 第二步:
https://github.com/dcevm/dcevm/releases下载之前配置号的Java环境对应的JDK版本的这个jar包,注意这里限制就是只能使用指定的版本,不要选择版本了

- 下载完成上面的Jar包之后,打开命令台,比如windows就是cmd命令台,进入到jar所在文件夹执行以下命令
java -jar DCEVM-8u181-installer-build2.jar(注意这里前提是已经配好了Java环境,可以直接使用java命令,否则会提示命令不存在),执行成功会弹出以下界面

上面的页面选择对应的JDK版本,我这里安装的是JDK8u181(注意可能你的系统会有多个JDK版本,选择第一步中下载并安装好的版本即可)。选择好之后有2个安装选项,红色箭头的选项就是不论什么情况下都是热部署的机制,改了代码重写编译即可生效。黑色箭头是可选性质的热部署,在启动Spring Boot项目时需要加入虚拟机选项才是热部署,虚拟机参数为-XXaltjvm=dcevm -javaagent:hotswap-agent.jar,至于这个hotswap-agent.jar是什么我们后面再讲,我们一般选择红色箭头的Replace by DCEVM即可。

安装成功之后,红色方框内会从NO变成显示YES,代表安装成功 - 进入到
https://github.com/HotswapProjects/HotswapAgent/releases网站下载一个名为hotswap-agent-1.4.1.jar的包,下载页面如下

- 使用IDEA进入到Spring Boot项目,进入到项目设置File -> Project Structure,选择安装好的对应版本的JDK

- 进入到IDEA插件下载页面,下载对应的插件HotSwapAgent

- 安装好插件之后,进入到Settings -> Tools -> HotSwapAgent页面,然后如果之前的步骤都做到位了,这个页面就会自动识别当前项目JDK的DCEVM及其版本,然后再上面那个红色箭头里手动加入之前下载的hotswap-agent-1.4.1.jar包的绝对路径即可,点击保存

- 实验一下,启动一个最简单的Spring Boot的web项目,新增一个接口,接口的功能是打印一串字符

这是原始代码以及调用之后的返回结果,现在修改代码,修改其返回内容,并重写编译当前类,点击Recompile

重写编译之后,IDEA会提示你是否重写加载类,这里选择Reload即可,也可以直接勾选默认直接每次自动重新加载类

再次调用接口,发现返回结果已经变了,没有重新启动项目,也可以达到一个马上修改马上生效的一个效果

Java11方案
与JDK8方案类似,但是安装的jar包需要在这个网站下载https://github.com/TravaOpenJDK/trava-jdk-11-dcevm/releases,同样是下载安装的jar包。其余步骤与JDK相同,重复即可。

以上内容有任何问题可随时浏览讨论,如果又错漏的地方请大佬指正。创作不易,希望大家能够点赞关注,万分感谢。
引用及参考页面:
https://github.com/HotswapProjects/HotswapAgent
https://github.com/TravaOpenJDK/trava-jdk-11-dcevm/releases
https://github.com/dcevm/dcevm/releases



















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/118297.html