关于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文件也就位,可以覆盖进项目啦,,,

觉得有用,记得点赞呦!!!

阅读全文
1 0