利用springloaded进行java jar&class的动态替换
之前已经写过一篇关于class的动态替换博客,今天我们来介绍一下如何用springloaded进行jar&class的动态替换。
首先说一下实验过程,结合了目前我正在做的项目,这个项目是一个前置系统,分别对接银联和核心系统。项目一开始由一个jar包组成,逻辑上可以分为3层:分发层,业务处理层,dao层(数据库操作相关),所有的class文件最后都在jar包中,运行时,只要启动这个jar包就行了,它是一个进程,会启动一个监听端口用来接收银联发送过来的报文。
这样做的缺点:后期你要修改代码,哪怕只有一行代码修改,你也要重新打包成jar包,kill掉正在运行的进程,然后重新启动!一开始对于我这种菜鸟,除了觉得这样做很麻烦之外,其他也没有觉得什么。后来,仔细一分析,在生产上运行,你停服务,是一件不可思议的事,因为所有的交易都要停止,像对于支付这样的交易,那影响就太大了!
所以,自然想到热部署方案,热部署网上也有一些相关的博客。但基本都不太“正规”,即都是那种简单的例子,看起来就不大可行。其中比较多的是自己定义classload来重新加载class文件,而且我看那些方法中路径和要重新加载的class文件都是写死的,这也太。。。当然,也有我觉得比较高大上的方法,就是将现在的系统改造成微服务架构,对于业务上独立的交易都改造成一个个微服务,那要卸载服务,重新部署服务自然都不在话下。不得不说,这确实是一个比较好的方法,但工作量和难度都是比较高的,想来想去,暂时不考虑,但会作为知识储备来学习,在适当的时间再来改造,因为这是趋势!
直到前几天,我偶然发现一个关于springloaded的帖子,这种方法比较简单,而且从名字可以看成,它是spring旗下的一个项目,应该来说还是比较可靠的,所以就试着用这个方法来进行改造,改造的方法也比较简单。
首先,我们要将jar包中的一些业务相关的代码从jar包中抽离出来,具体拆分的方法可以为,基本不需要修改的代码或者框架型的代码放在jar包中,而后期需要经常修改的代码从jar包冲分离出来。如下图:
所有的业务相关的代码(class文件)都放在business文件夹下,具体做法是创建了一个新的工程,然后现有的工程会依赖这个新的工程。同时,可以看到相关的配置文件我们也从jar包中分离出来,比如mybatis文件夹中放的是和数据库操作相关的文件。
我们在libs文件夹中放入
然后,输入命令:
这里插播一下,一开始我是上面这种写法,但是发现jar替换时不起任何效果,后来我想会不会是顺序的问题,我把-jar后面的参数移到最后面,发现这时候起作用了:
然后参数verbose可以省略,因为加上这个参数,日志中会有很多详细的信息,生产上不太方便查看,测试的时候可以加上。
我们发起一笔报文,前置系统运行结果如下:
我们对这个交易的代码进行修改,把“协议支付签约触发短信”这几个字去掉,然后保存,用这个class文件替换原先的class文件
可以看到,在不用停程序的情况下,运行结果已经改变了,基本达到我们的需求。
接下来的话就是,如果jar包里面的代码有修改,那就重新打包来替换旧的jar包,与替换class文件类似,我试了一下,同样是可以的。
2018-07-25更新
今天我在生产上试了一种情况,发现更换了class没有用,比如:a.jar直接调用了b.class,而b.class又调用了c.class,现在替换了c.class文件,发现不起作用。我们上面的例子是替换了b.class文件起作用。只有重启,c.class文件才起作用。这个问题后续值得继续关注!
利用springloaded进行java jar&class的动态替换的更多相关文章
- 利用springloaded进行java class动态替换
我们知道对于一个java文件,如Test.java,首先需要通过javac命令(javac Test.java)进行编译,生成class文件,再将class文件在jvm上进行加载运行,也就是java命 ...
- 【java】 linux下利用nohup后台运行jar文件包程序
Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...
- 使用C#利用cmd来调用java jar包获取其中的数据
其实也很简单,就是在C#中构建一个Process,启动jar包,并且给jar包传递参数 因为我并没有怎么学过JAVA,所以只写了个很小的Demo,就是根据传入的参数获取对应的数据 以下是JAVA De ...
- java -jar参数运行方式设置classpath
转载自:https://www.cnblogs.com/aggavara/archive/2012/11/16/2773246.html 当用java -jar yourJarExe.jar来运行一个 ...
- Java安全之Javassist动态编程
Java安全之Javassist动态编程 0x00 前言 在调试CC2链前先来填补知识盲区,先来了解一下Javassist具体的作用.在CC2链会用到Javassist以及PriorityQueue来 ...
- 【hadoop2.6.0】利用Hadoop的 Java API
Hadoop2.6.0的所有Java API都在 http://hadoop.apache.org/docs/r2.6.0/api/overview-summary.html 里. 下面实现一个利用J ...
- -Xbootclasspath参数、java -jar参数运行应用时classpath的设置方法
当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误.实际上 ...
- 利用sfntly的sfnttool.jar提取中文字体
雨忆博客中提到了sfntly(具体介绍可以看:https://code.google.com/p/sfntly/),利用其中sfnttool.jar就可以提取只包含指定字符的字体,如果想在页面中通过@ ...
- 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
原文:[项目分析]利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码 最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程 ...
随机推荐
- java中的内部类详解
https://www.cnblogs.com/dolphin0520/p/3811445.html https://www.cnblogs.com/chenssy/p/3388487.html
- bcdboot(引导修复工具) 命令行工具使用方法
BCDboot 是一种用于快速设置系统分区或修复系统分区上的启动环境的工具.系统分区是通过从已安装的 Windows(R) 映像复制一小部分启动环境文件来设置的.BCDboot 还会在系统分区上创建引 ...
- 阿里巴巴数据源Druid在tomcat中的配置
这里只说需要的配置文件,不讲具体的项目,仅作为备忘. pom.xml文件添加 <!-- druid --> <dependency> <groupId>com.al ...
- os.rename 和os.replace
f1 = open("hello.txt","w") f1.write("hello,my name is bobo.") f1.close ...
- 关于Django部分
1 安装 执行pip安装即可 pip install Django 2 开启项目 3 项目新建后所在位置: 4 开启端口命令 python manage.py runserver 0.0.0.0:9 ...
- [UE4]Spin Box,数字输入,可拖动
一.Spin Box在Input组下 二.Spin Box的文字样式可以在Spin Box.Display中修改 三.Spin Box事件 1.On Value Changed:值改变时触发 2.On ...
- python网页爬虫开发之二
1.网站robots robotparser模块首先加载robots.txt文件,然后通过can_fetch()函数确定指定的用户代理是否允许访问网页. 2.识别网站技术 3.下载网页 使用urlli ...
- Centos6搭建Samba服务并使用Windows挂载
一.安装相关软件 [root@mail ~]# yum install samba samba-client -y #安装相关软件 二.配置匿名访问 [root@mail ~]# cd /etc/sa ...
- 多端统一框架尝试--Taro
参考资料 Taro官网Taro GitHubTaro资源汇总Taro-UI 我的demo代码 github地址 Taro介绍和尝试心得 Taro是基于React语法规范开发的多端统一的框架,一套代码可 ...
- Python的随机数模块
random模块中几个随机函数用法. 引入random模块: import random 1.random.random() 此函数用于生成一个0到1的随机浮点数:0 <= n < 1.0 ...