关于Activiti多级审批自动绘图以及修改class方面的经验
2017-07-13 16:24
351 查看
这两天公司给了我一个新需求:多级审批。我们的审批流用的是Activiti框架,如果是固定级别的审批流程,可以通过Activiti的界面化工具进行绘图,但如果是不固定级别的审批,就需要用代码进行Bpmn模型制作,制作完毕后通过
自动生成流程图(这方面有兴趣的同学可以私信我一起探讨,因为这里不是本文的重点,所以不做过多描述),这句代码可以在很多Activiti逐级审批的文章中看到,可是我在实际应用中,却报错了。
![](https://img-blog.csdn.net/20170713161316229?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
java.lang.NoClassDefFoundError:com/mxgraph/view/mxGraph
看源码了解到BpmnAutoLayout类的第96行是这样的:
![](https://img-blog.csdn.net/20170713161429263?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
new了一个mxGraph,
好,既然这样,就去下载这个jar包喽,这是个专门用来前端绘制图片的工具。
![](https://img-blog.csdn.net/20170713161514111)
ok,add 到classPath之后,点击运行,又报错了:
![](https://img-blog.csdn.net/20170713161558218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
java.lang.NoSuchFieldError:orthConnector
它说找不到这个变量资源???!!网上几乎所有文章都说这个异常是因为导入了重复的jar包,我只导入了一个,所以排除这个可能性。
那到底因为什么呢,我去查BpmnAutoLayout。java:222行,是这样的:
![](https://img-blog.csdn.net/20170713161645461?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
没错,就是这个变量找不到,那我就只好人工去找一下喽
![](https://img-blog.csdn.net/20170713161745974?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
居然找到了,这不是有嘛,为什么找不到呢?????!!!
等等,我好像发现了什么,BpmnAutoLayout第222行调用的是orthConnector,但是这里是OrthConnector。。。第一个字母大小写不一样
![](https://img-blog.csdn.net/20170713161808105?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这什么鬼,,,我搜了一下,就只有这一个地方有这个变量,排除两个名字是不同变量的可能性。。。
事已至此,只能改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文件:
![](https://img-blog.csdn.net/20170713162004041?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3、打开左边树状图的“Methods”菜单:
![](https://img-blog.csdn.net/20170713162059088?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
4、找到要修改的代码所在的方法,打开,并找到问题代码:
![](https://img-blog.csdn.net/20170713162128711?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
5、单击前面#129,进入下一个页面:
![](https://img-blog.csdn.net/20170713162149307?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
6、单击Name and type后面的链接,进入下一个页面:
![](https://img-blog.csdn.net/20170713162218595?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
7、我们可以看到Name后面就是问题代码,点击进去:
![](https://img-blog.csdn.net/20170713162259865?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejQ3OTQwMzM3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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文件也就位,可以覆盖进项目啦,,,
觉得有用,记得点赞呦!!!
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文件也就位,可以覆盖进项目啦,,,
觉得有用,记得点赞呦!!!
相关文章推荐
- php面向对象中的单例与静态方法的对比,以及关于class自动加载的分析
- 关于max_allowed_packet的修改,以及修改后总是自动重置1024
- android中关于class Build以及如何修改android固件版本号
- 关于Cygwin的x-Server的自动运行以及相关脚本修改
- 关于eclipse部署tomcat后项目加入根目录以及XML自动修改的问题
- [置顶] QEE2.1 色色修改版 - 增加多级目录模块结构以及扩展web自动构建工具
- 关于Matlab的Web开发以及Matlab webservice服务的实现经验
- 关于修改frameworks的源码遇到的一点问题以及解决方法
- 关于ASP.NET同页面内【用户控件与父页面】以及【用户控件与用户控件】之间方法调用/传值 一点点经验
- 关于选择smarttemplate的一些原因,以及对其做的一些修改
- 关于烫烫烫以及recv时候的小经验
- 关于批处理修改网卡ip以及网关,dns
- 关于Class和Assembly的变化率以及变化原因的一点思考
- 关于多级审批工作流的问题描述
- 【实际经验】关于开启网络启动功能无法修改网卡MAC地址经验谈
- 关于linux系统下CST时间的修改以及对MB中关于CURRENT_TIMESTAMP函数
- 关于Linux的makefile的自动生成,以及.configure及编译选项
- 关于ASP.NET同页面内【用户控件与父页面】以及【用户控件与用户控件】之间方法调用/传值 一点点经验
- 实习结束了,临走还捞了一票...和Jason聊了许多关于以后在校园技术实践以及学习的方法,宝贵经验,记录下来。
- 根据自己多年来在招聘方面的经验,提供关于一些关于外企如何招聘的信息。