您的位置:首页 > 编程语言 > Java开发

关于Activiti多级审批自动绘图以及修改class方面的经验

2017-07-13 16:24 351 查看
这两天公司给了我一个新需求:多级审批。我们的审批流用的是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文件也就位,可以覆盖进项目啦,,,

觉得有用,记得点赞呦!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐