学习IntelliJ IDEA之Jrebel插件
IDEAadmin 发布于:2019-05-08 21:43:34
阅读:loading
如果不是使用IDEA我可能现在还不知道有个非常有用的插件叫Jrebel,它是一款基于Java虚拟机层面的插件,使得在开发过程中实现高可用的热部署,能够大大的提升了编码的效率。在此之前我所理解的热部署就是修改代码不用重启WEB服务器,但是所涉及的代码修改存在范围上的限制,比如我们只能修改Java方法的内部、前台页面,至于增加了新的类、新的方法、全局变量、配置文件(除非每次程序自行读取配置文件)等等,它们都是需要重新编译再重启服务器才可生效。在我下载Jrebel插件的时候,发现它并不限于IDEA平台,Eclipse与NetBeans仍然支持(这两个平台我并没有去尝试使用)。
举个常见的场景,假设我们使用到了mybatis,开发阶段频繁的修改Mapper.xml文件中的SQL语句,这就要求我们频繁的去重启服务器,当然也可以使用其它方式来省去修改后重启,那么你可能是需要自行改写Mapper.xml的读取方式,监控文件的变更去触发内容的生效;或者你也可以引入mybatis-plus来实现自动编译,但它们都会增加一些额外与框架自身无关的实现且额外增加关于投产环境profile的参数定义,然而直接使用Jrebel则可非常方便的实现(不限于)这一需求。
安装Jrebel插件,本次使用在线的方式安装,最新的插件版本为“Version: 2019.1.1”,那么毫无疑问这里就下载这个版本(也下载过2018.2的版本,因为我现在使用的IDEA版本号就是它),安装完成需要激活它,它并不是一款免费的软件,所以在此之前你也可以去购买授权,但是你也可以去破解它。由于一头雾水的使用Jrebel,前面先是使用了Jrebel6.4.3版本,它的破解也是比较访问直接替换两个jar文件,放置一个license文件即可免费使用一生,后来再使用这个版本与springboot(2.1.4我使用的都是目前为止最新版本)结合使用时发现报错了,经过百科后的结果是有人说这个版本不支持spring4.4以后的版本,而我使用的spring-core版本已经到5了,所以不犹豫的就进行了版本升级,直接使用现在的最新版本,像我这种处于新手使用阶段破解方式也采用的是那种比较简单的阶段性破解的方式,半年一次替换。
在安装完Jrebel后,在工具栏的图标处会多出来两个Jrebel的图标,分别是使用Jrebel启动和Jrebel调试启动。但是如果此时安装激活后就直接去运行的话,你会发现并不好使,因为IDEA默认并没有开启自动编译,所以还需要进行一下设置,参考如下图所示:
(1)开启自动编译,Settngs -> Build,Execution,Deployment -> Compiler,选中Build project automatically(eclipse平台默认勾选)
(2)设置当程序运行时自动编译运行,按下Ctrl + Shift + Alt + / 选择 1.Registry,在弹出窗口中勾选compiler.automake.allow.when.app.running,参考下图所示:
我这里有一个最近搭建的springboot(2.1.4)框架项目,启动时需要使用Jrebel的方式启动,在启动时我们会发现Jrebel的日志信息,后续是项目自己的日志信息,当我们修改代码内容后控制台稍后会自动出现编译生效提示,使用run或debug模式都会生效,如果你的机器配置还不错,在你每次切换IDEA工具时它都会立即触发重新编译,非常方便,参考下图所示:
此时热部署Java已经OK,设置springboot的update class and resources来让切换IDEA(失去焦点)或者保存后自动部署,参考如下图所示:
访问一个不存在的Controller地址,浏览器地址出现404报错,而后直接增加此函数,在不重启的情况下体验一下Jrebel的热部署,参考过程如下图所示:
再次刷新即可看到更改已经生效,如此新增一个方法就已经热部署了,那么修改方法内部的热部署就不用说了吧。
访问一个SQL查询语句,select 1001 id , 'cdd' name , '襄阳' city,先查看控制台输出的SQL语句及打印的查询结果,参考如下图所示:
直接修改这个SQL语句,将1001-->1002,cdd-->chendd,在此刷新页面查看控制台输出信息如下:
(3)修改model对象,增加city属性及属性方法和toString函数
也许你已经有了一个疑问,为什么输出的信息中没有city数据呢,这是一个巧合,通过查看代码发现User对象中并不存在city属性,那么接下来就是在User中创建一个city属性,并生成gett/set函数,重新生成toString函数,再刷新功能验证热部署,参考如下:
(4)最后再修改一下mapper.xml的查询SQL吧,将city=襄阳修改为襄樊,参考如下:
实际上这里应该是新增一个Controller类的验证;或者spring boot项目中修改定时任务触发频率(@CronTrigger)的验证;或者是spring boot jpa中Repository的@Query注解SQL语句修改后的验证等等;
(1)在整个过程中每次修改代码均没有重启过服务器;
(2)本次实践的范围包括:增加新的方法、新的属性、属性方法、修改已存在的方法、mybatis的Mapper.xml配置文件修改等;
(3)在实践过程中遇到的坑,起初输出SQL查询结果时使用的是fastjson直接将对象转换为json,也许是fastjson内部实现的机制吧,导致在增加city属性后并未输出city属性的结果,后来将json输出给修改为使用toString输出;
(4)在使用Jrebel于springboot最新版(2.1.4)整合mybatis时出现了一个启动问题,main函数的方式启动正常,而Jrebel死活保存,这个待后期的springboot系列文章再给出;
(5)与springboot提供的开发热部署不是一个梯队的;
本次提供实践过程屏幕录像程序下载和所使用的IDEA的Jrebel版本离线下载包
链接:https://pan.baidu.com/s/1nrpUiZZyyyYUIGGyl7hKhg
提取码:sml7
点赞