关于Activiti多级审批自动绘图以及修改class方面的经验
来源:互联网 发布:mac win8u盘安装 编辑:程序博客网 时间:2024/06/16 11:11
这两天公司给了我一个新需求:多级审批。我们的审批流用的是Activiti框架,如果是固定级别的审批流程,可以通过Activiti的界面化工具进行绘图,但如果是不固定级别的审批,就需要用代码进行Bpmn模型制作,制作完毕后通过
new BpmnAutoLayout(model).execute();
自动生成流程图(这方面有兴趣的同学可以私信我一起探讨,因为这里不是本文的重点,所以不做过多描述),这句代码可以在很多Activiti逐级审批的文章中看到,可是我在实际应用中,却报错了。
java.lang.NoClassDefFoundError:com/mxgraph/view/mxGraph
看源码了解到BpmnAutoLayout类的第96行是这样的:
new了一个mxGraph,
好,既然这样,就去下载这个jar包喽,这是个专门用来前端绘制图片的工具。
ok,add 到classPath之后,点击运行,又报错了:
java.lang.NoSuchFieldError:orthConnector
它说找不到这个变量资源???!!网上几乎所有文章都说这个异常是因为导入了重复的jar包,我只导入了一个,所以排除这个可能性。
那到底因为什么呢,我去查BpmnAutoLayout。java:222行,是这样的:
没错,就是这个变量找不到,那我就只好人工去找一下喽
居然找到了,这不是有嘛,为什么找不到呢?????!!!
等等,我好像发现了什么,BpmnAutoLayout第222行调用的是orthConnector,但是这里是OrthConnector。。。第一个字母大小写不一样
这什么鬼,,,我搜了一下,就只有这一个地方有这个变量,排除两个名字是不同变量的可能性。。。
事已至此,只能改jar包了,两个jar包都可以改,我对比了一下,打算改那个东西最少的jar包:activiti-bpmn-layout-5.17.0.jar
这里着重介绍一款很方便的修改jar包内容的工具:jclasslib bytecode viewer,它可以不通过编译,直接修改class文件,是不是很厉害,,,
1、首先从你的jar包中提取出来要修改的class文件(可以用360压缩打开jar包后直接拖拽出来)
2、用jclasslib bytecode viewer打开该class文件:
3、打开左边树状图的“Methods”菜单:
4、找到要修改的代码所在的方法,打开,并找到问题代码:
5、单击前面#129,进入下一个页面:
6、单击Name and type后面的链接,进入下一个页面:
7、我们可以看到Name后面就是问题代码,点击进去:
8、记住选中行前面的数字,本例中是650
9、打开eclipse,新建一个java项目,新建一个java类:
import java.io.*; import org.gjt.jclasslib.io.ClassFileWriter; import org.gjt.jclasslib.structures.CPInfo; import org.gjt.jclasslib.structures.ClassFile; import org.gjt.jclasslib.structures.constants.ConstantUtf8Info; public class Test { public static void main(String[] args) throws Exception { String filePath = "E:\\BpmnAutoLayout.class"; //先把要修改的class文件放到这个目录下。 FileInputStream fis = new FileInputStream(filePath); DataInput di = new DataInputStream(fis); ClassFile cf = new ClassFile(); cf.read(di); CPInfo[] infos = cf.getConstantPool(); int count = infos.length; for (int i = 0; i < count; i++) { if (infos[i] != null) { System.out.print(i); System.out.print(" = "); System.out.print(infos[i].getVerbose()); System.out.print(" = "); System.out.println(infos[i].getTagVerbose()); if(i == 650){ //注意这里要改成刚刚记录的数字,这里是650 ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i]; uInfo.setBytes("OrthConnector".getBytes()); //这里双引号里写上要改成的内容。 infos[i]=uInfo; } } } cf.setConstantPool(infos); fis.close(); File f = new File(filePath); ClassFileWriter.writeToFile(f, cf); } }注意,要先去网上下载jclasslib.jar导入到新建的项目中
10、最后执行该main方法,该main方法会直接修改filePath路径里的class文件,最后在360压缩里直接用新的class覆盖旧的class文件就好啦
至此,class文件已修改完毕,新的jar文件也就位,可以覆盖进项目啦,,,
觉得有用,记得点赞呦!!!
- 关于Activiti多级审批自动绘图以及修改class方面的经验
- 关于activiti搭建的几条经验之一
- 关于activiti搭建的几条经验之二
- 关于prototype以及继承方面的理解
- Activiti逐级审批
- activiti超时自动审批
- 关于安卓APP瘦身方面的经验()
- Activiti获取某个流程实例已经审批的节点记录
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- [MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- [MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- [MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- [K/3Cloud]K3Cloud的移动审批方面
- JSON数据与JavaScript对象转换
- 3.4Linux 文件系统挂载
- 数据对接—kettle使用知识15
- 4.Linux获取帮助
- K-means聚类
- 关于Activiti多级审批自动绘图以及修改class方面的经验
- 5.用户及权限
- MAC环境如何将本地代码上传到GitHub上
- Object.create()方法的使用
- 7.1 管道、重定向
- Map的KEY值转成大写
- 实体类对象与XML字符串的序列化和反序列化(示例)
- 7.2 Linux 命令行文本处理
- 最佳日志数据实践