简介:面向Java后端开发者、流程管理员及工作流技术学习者,这份Activiti 5.22完整包提供了可直接部署到Servlet容器(如Tomcat)的activiti-explorer.war。Activiti是开源工作流与业务自动化引擎,常被用于企业业务流程管理;Explorer是其图形化操作界面,支持流程设计、实例启停、任务审批、用户与权限管理等常见功能,能帮助非技术人员快速参与流程运维。压缩包内含79个文件,整体约88.33MB,内容以48个jar依赖为主,覆盖Spring、MyBatis、Activiti引擎等核心组件;另有10个xml配置、8个class文件,以及若干properties、图片、json和svg资源。目录采用Java Web标准结构,META-INF与WEB-INF分别记录应用元信息和具体部署配置,便于直接放入Tomcat运行或在此基础上展开二次开发。目前已有1190人浏览学习,适合刚接触Activiti工作流框架的开发者参考。资源内含请假、故障修复等示例流程,结合BPMN2.0定义与监控界面,读者可较快掌握流程建模、任务分发和流程实例跟踪的关键思路。虽然5.22版本较早,但核心架构与5.x系列一脉相承,用于理解Activiti运行原理和搭建小型流程管理系统依然足够。这份war包可通过浏览器直接访问控制台,适合作为入门实践沙箱,对于希望快速上手BPMN流程设计、又不想从零搭建环境的开发者是一站式选择。
1. 别急着升级:Activiti 5.22 完整包仍是很多老项目的“后悔药”
第一次接触 Activiti 的时候,我手里是一个跑了三年的老系统,流程数据全在 5.x 的 act_hi_* 表里。当初接手的人早就走了,留下的文档只说“部署一个 war 包就行”,可没人告诉我这个 war 包到底从哪来、装到哪个 Tomcat 里才不会报错。后来我在某公司做技术交接,翻遍了内部盘才找到 Activiti 5.22 完整包和 activiti-explorer.war。那一刻我才意识到,这套 5.22 不是“过时货”,而是大量存量系统的地基——它内置了完整的 BPMN 2.0 引擎、流程设计器、管理控制台和演示流程,只要环境匹配,部署完就能看到流程定义、任务列表、历史实例这些核心能力。本文会把这个完整包里最实用的部分拆给你看:怎么让 activiti-explorer.war 在 Tomcat 里跑起来、怎么接外部 MySQL、以及我在模拟项目X里踩过的四个坑。适合还在维护 5.x 老系统的人,也适合刚入坑想找一个能离线研究的工作流参考实现的开发者。
2. 先理解 Activiti 5.22 的组成:war 包不是全部,引擎和表结构才是核心
2.1 Activit 5.22 的版本定位:为什么 5.x 停在了这条线
Activiti 从 5.x 跳到 6.x 再跳到 7.x,中间经历了引擎重构、云原生支持和商业化转型。5.22 是 5.x 序列里比较成熟的收敛版本,后面基本只做维护性更新。这意味着两件事:第一,5.22 的 API 和表结构与早期的 5.15、5.16 保持兼容,老项目升级到 5.22 的代价相对可控;第二,网上大量教程、论坛帖子、代码片段都是基于 5.x 写的,你搜到的大部分答案在这个版本上直接有效。
从引擎构成看,5.22 分三块:process-engine 负责流程定义解析、执行、任务调度;activiti-explorer 是一个 Web 控制台,既可以当管理后台,也可以当流程设计器;activiti-rest 提供 REST API,但 5.22 的 REST 风格偏老,实际项目里用到的人不多。我一般会把 explorer 当成“可视化验证窗口”,把 process-engine 的 API 集成到自己的管理系统里。
2.2 部署前必须知道的表结构与初始化逻辑
Activiti 引擎启动时会自动检查数据库里是否存在 ACT_ 前缀的表。如果不存在,就按配置的 database-schema-update 策略建表。5.22 默认值是 false,意思是不自动建表;改成 true 则每次启动都会检查并更新结构。生产环境我建议先用 true 跑一次初始化,然后把配置改回 false,避免后续代码里操作流程表时误触发结构变更。
5.22 的表按职责分成几类:
| 表前缀 | 职责 | 典型用途 |
|---|---|---|
| ACT_RE_* | 流程定义和模型静态数据 | ACT_RE_PROCDEF 存流程定义的 key、版本、部署 ID |
| ACT_RU_* | 运行时数据,流程结束后清理 | ACT_RU_TASK 待办任务、ACT_RU_EXECUTION 执行实例 |
| ACT_HI_* | 历史数据,永久保留 | ACT_HI_PROCINST 已完结流程、ACT_HI_TASKINST 历史任务 |
| ACT_ID_* | 用户和组 | 如果接外部用户体系,这组表可以不用 |
| ACT_GE_* | 通用数据 | 字节数组、属性配置 |
如果你要用 explorer 里的“新建流程”画一张在线流程图,它会把 BPMN 2.0 的 XML 存到 ACT_GE_BYTEARRAY,同时在 ACT_RE_MODEL 里登记一条模型记录。部署模型后才会生成 ACT_RE_PROCDEF。这个顺序不是可有可无的,很多新手在 explorer 里画完图找不到流程定义,就是因为只保存了模型,没点“部署”。
2.3 环境选型:Tomcat 版本和 JDK 版本的匹配关系
Activiti 5.22 官方推荐的运行环境是 JDK 1.7+,但现实中我遇到的部署环境大多是 JDK 1.8。JDK 1.8 下跑 5.22 没有问题,我已经在某跨平台系统上这样稳定运行过。比较麻烦的是 Tomcat 版本。5.22 默认 servlet 规范是 3.0,也就是 Tomcat 7/8 的范畴,Tomcat 9 之后是 servlet 4.0 规范,虽然 war 包也能部署,但 explorer 里部分页面依赖老的 jsp 标签库写法,高版本 Tomcat 会因缺少某些类而白屏。
我一般会选 Tomcat 8.5.x,这是 5.22 和 explorer 兼容性比较好的组合。不要用 Tomcat 10.x,那个默认的 Jakarta 命名空间迁移会让 5.22 的很多类直接 ClassNotFound。数据库方面,5.22 自带的驱动支持 MySQL 5.x,如果你用的是 MySQL 8.x,需要手动换一个 8.x 的 JDBC 驱动,否则建库连接会报 SSL 和时区错误。
3. 部署 activiti-explorer.war:完整步骤与关键配置解析
3.1 先把 war 包放对位置:从解压到启动的完整命令序列
拿到 Activiti 5.22 完整包后,你会看到里面通常有多种文件,但最核心的是 activiti-explorer.war 和 activiti-rest.war。我一般只部署 explorer,因为它的功能覆盖了 rest 的大部分演示场景。以下是部署到 Tomcat 8.5 的标准流程:
# 假设 Tomcat 安装在 /opt/tomcat8.5 cd /opt/tomcat8.5/webapps cp /data/downloads/activiti-explorer.war . # 启动 Tomcat,war 包会自动解压到同名目录 cd /opt/tomcat8.5/bin ./startup.sh # 等待 10~15 秒后,检查解压目录和日志 ls -l /opt/tomcat8.5/webapps/activiti-explorer tail -50 /opt/tomcat8.5/logs/catalina.out这个流程里有几个关键点。war 包为什么不手动解压?因为 Tomcat 对 war 包有一套自己的解压、缓存和热发布机制,手动解压后如果 war 包时间戳比目录新,Tomcat 反而会覆盖你的手工修改。我吃过这个亏,改了 explorer 里的配置文件后被再次解压还原。如果你确实要改配置,先让 Tomcat 自动解压一次,然后再去改解压后的文件。
启动后如果 catalina.out 里出现Deployment of web application archive [activiti-explorer.war] has finished这样的日志,说明 war 包已成功部署。这时候访问http://localhost:8080/activiti-explorer,能看到登录页。
3.2 修改数据源:把默认的 H2 换成 MySQL
explorer 默认使用 H2 内存数据库,这意味着每次重启 Tomcat,所有流程定义、用户、历史记录全部归零。开发时偶尔用一下还行,一旦你想在里面测试完整的审批链条,内存库会让你崩溃。所以我建议第一步就切换到 MySQL。
Activiti 5.22 访问 MySQL 的配置在WEB-INF/classes/db.properties和WEB-INF/classes/activiti-context.xml里。我习惯只改 db.properties,因为 context 里的数据源 bean 是从这个外部属性文件读取配置的:
db=mysql jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf8 jdbc.username=activiti_user jdbc.password=your_password改完之后,还需要确认 activiti-context.xml 中 dataSource 的 bean 是否指向了这些属性。常见的做法是使用<context:property-placeholder location="classpath:db.properties"/>引入属性文件,然后在org.springframework.jdbc.datasource.SimpleDriverDataSource或org.apache.commons.dbcp.BasicDataSource配置里通过${jdbc.driver}引用。
参数说明一下:useUnicode=true&characterEncoding=utf8是必须的,否则流程定义里如果包含中文名称或带中文的流程变量,存进 MySQL 后会出现乱码。jdbc.url里的数据库名 activiti 需要你先在 MySQL 里建好,Activiti 只会建表,不会建库。
3.3 启动后验证:登录、默认账号和初始应用
切换到 MySQL 后重启 Tomcat,再访问 explorer 登录页。5.22 的默认账号是 kermit/kermit,这是一个内置的超级用户,属于 Activiti 自带的管理员。登录进去后你能看到五个大模块:流程、任务、报表和管理。第一次进来我建议按这个顺序操作:
先看“管理”菜单里的数据库表,如果 ACT_DE_MODEL、ACT_RE_PROCDEF 这些表都有数据,且 MySQL 的 act_hi_* 表里有对应的建表记录,说明 dataSource 切换成功。再去看“流程”菜单,里面自带的演示流程有 leave-demo、vacation-request 等。点一个查看流程图,能正常显示就把渲染环境确认了。
我遇到过一个情况:MySQL 连接配置正确,但 explorer 登录后页面列表一直转圈。查日志后发现是 H2 的依赖 jar 还在 classpath 里,Activiti 自动探测时优先用了 H2 而不是 MySQL。解决方法是把WEB-INF/lib下的 h2-*.jar 删掉,再清理 Tomcat 的work/Catalina/localhost/activiti-explorer缓存目录。这个坑花了我一下午,所以想放在这里提醒你。
4. 用在线设计器跑通一条完整请假流程:配置参数与执行观察
4.1 在 explorer 里新建并部署流程模型
explorer 的在线设计器是 Activiti 5.22 演示能力里最直观的部分,它生成的是 BPMN 2.0 标准的 XML,底层由 ProcessEngine 解析。部署一个流程的完整路径是:模型 → 新建 → 输入名称和 key → 打开设计器 → 拖节点 → 保存 → 部署。
以请假流程为例,我一般这样设计:一个 StartEvent,一个 UserTask 叫“部门经理审批”,一个 ExclusiveGateway 判断请假天数是否超过 3 天,超过就再加一个 UserTask 叫“人事复核”,最后 EndEvent 结束。设计器的操作逻辑和现在主流流程设计器类似,但它有一个不显眼但关键的按钮:“部署”在“操作”列表里,不在保存按钮旁边。
<process id="leaveProcess" name="leaveProcess" isExecutable="true"> <startEvent id="startEvent" name="Start"/> <userTask id="managerTask" name="部门经理审批" activiti:assignee="${assignee}"/> <userTask id="hrTask" name="人事复核" activiti:assignee="${hrManager}"/> <exclusiveGateway id="gateway" name="gateway"/> <endEvent id="endEvent" name="End"/> <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="managerTask"/> <sequenceFlow id="flow2" sourceRef="managerTask" targetRef="gateway"/> <sequenceFlow id="flow3" sourceRef="gateway" targetRef="hrTask"> <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${days > 3}]]> </conditionExpression> </sequenceFlow> <sequenceFlow id="flow4" sourceRef="gateway" targetRef="endEvent"> <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${days <= 3}]]> </conditionExpression> </sequenceFlow> </process>这段 XML 是从设计器保存的模型里提炼出来的核心结构。需要注意isExecutable="true",5.22 要求流程必须显式声明可执行,否则引擎只把它当描述模型,不会生成运行实例。activiti:assignee="${assignee}"表示任务的办理人由流程变量决定,这个在实际对接业务系统时非常实用。
4.2 发起流程实例与观察 ACT_RU_* 表的变化
部署完成后,在 explorer 的“流程”列表里能看到这条流程定义。点“发起流程”就会创建一个新的 ProcessInstance。这时候去 MySQL 里查几个核心表,能非常清晰看到工作流引擎的运转轨迹:
-- 查看当前有哪些运行中的执行实例 SELECT ID_, PROC_INST_ID_, BUSINESS_KEY_, ACT_ID_ FROM ACT_RU_EXECUTION; -- 查看当前待办任务 SELECT ID_, NAME_, ASSIGNEE_, PROC_INST_ID_ FROM ACT_RU_TASK; -- 查看运行时流程变量,看 gateway 判断条件用的变量是否存在 SELECT NAME_, TYPE_, TEXT_ FROM ACT_RU_VARIABLE WHERE PROC_INST_ID_ = '你的流程实例ID';发起流程后,ACT_RU_EXECUTION 会插入一条主执行实例记录,如果流程中有并行网关或多个分支,还会出现子执行实例。ACT_RU_TASK 里生成一条“部门经理审批”的任务,ASSIGNEE 字段的值就是发起时传入的 assignee 变量。这些表在流程实例完全结束后会被清理,所以如果你想留痕,一定要在流程还在运行时查询。
我做过一次实验:发起 10 条不同天数的请假流程,小于 3 天的走直接结束分支,大于 3 天的停在人事复核节点。通过半自动扫描 ACT_RU_TASK 的数量变化,能验证 ExclusiveGateway 的条件判断是否按预期工作。这个过程对理解 Activiti 的令牌机制非常有帮助。
4.3 边界配置参数:历史级别、任务自动完成与事件监听
除了默认配置,5.22 里还有几个参数值得你提前设好,否则后面维护时会出现“表数据增长太快”或“看不到历史流程”的情况。
| 配置项 | 位置 | 可选值 | 含义 |
|---|---|---|---|
| history | 引擎配置的 bean 属性 | none / activity / audit / full | 历史数据保存粒度,full 会记录所有变量快照 |
| asyncExecutorActivate | 引擎配置 | true / false | 是否启用异步执行器,定时任务和边界事件需要它 |
| jobExecutorActivate | 5.22 老版配置 | true / false | 旧版任务执行器开关,新项目用 asyncExecutor 替代 |
| databaseSchemaUpdate | db.properties 对应引擎属性 | true / false / create-drop | 建表策略,生产环境跑完初始化后要改回 false |
historical 级别建议在开发阶段直接用 full,这样每个节点改动的流程变量都能从 ACT_HI_VARINST 里回溯。生产如果关心性能,可以降到 audit,它在流程结束后保留实例和活动节点信息,但不记录变量快照。我操刀的某个项目就是用了 full 级别,后来排查“某笔流程为什么走了异常分支”时,从历史变量里直接看到了条件字段的变化轨迹,省去了一层层翻业务日志的功夫。
5. 接手 Activiti 5.22 必看的避坑清单:来自真实部署环境的记录
5.1 现象:Tomcat 启动后 explorer 页面 404 或 503
原因:Tomcat 版本与 war 包中 servlet 相关依赖不匹配。我用 Tomcat 10 部署 5.22 时,控制台直接报java.lang.NoClassDefFoundError: javax/servlet/...,因为 5.22 里的 jsp 实现基于 javax.servlet,而 Tomcat 10 换成了 jakarta.servlet 命名空间。
解决:换回 Tomcat 8.5.x,或者在 Tomcat 10 里加兼容库,但那个方案非常折腾,不建议尝试。从我的实践看,Tomcat 8.5.100 左右的版本对 5.22 最友好,Tomcat 9 也能跑,但个别 jsp 页面会出现奇怪的样式丢失。
5.2 现象:MySQL 连接报 SSL 和时区错误
原因:MySQL 8.x 驱动强制要求处理 SSL 和 serverTimezone。5.22 自带的驱动是com.mysql.jdbc.Driver,这个类在 MySQL 8.x 的驱动包中已标记为废弃,而且连接串里没带 serverTimezone 会被拒绝。
解决:把WEB-INF/lib下老的 mysql-connector-java-5.x.jar 删掉,换 mysql-connector-java-8.0.x.jar。连接串改成:
jdbc.url=jdbc:mysql://127.0.0.1:3306/activiti?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai5.3 现象:流程部署成功,发起时提示“no processes deployed with id”
原因:这是一个典型的肉眼与数据库不一致问题。explorer 里显示的“已部署流程”和 ProcessEngine 实际能查到的部署记录不同步。常见原因是你在模型列表里点了“保存”而不是“部署”,保存只是写了 ACT_RE_MODEL,没有生成 ACT_RE_PROCDEF。
解决:确认部署成功的标准不是模型列表里有数据,而是 ACT_RE_PROCDEF 表里出现了以流程 key 为标识的记录。在 explorer 的“流程”页面能看到“发起流程”按钮才算真正部署完成。
5.4 现象:Tomcat 重启后流程定义和账号全没了
原因:这是 H2 默认内存库的典型特征。explorer 开箱即用的配置里数据源指向 H2 的 mem 模式,一旦进程退出,数据随内存释放。如果数据库表没建在 MySQL 里,那你看到的“一切正常”都只是当前进程内的幻象。
解决:按照第 3 章的步骤切换到 MySQL 并建好表。切换后验证的方式是重启 Tomcat,再登录 explorer,看“管理”里的表记录是否还在。如果表记录还在,说明数据源切换成功;如果变成空白初始状态,就回到第 3.2 节检查 property-placeholder 有没有正确加载未被覆盖的 db.properties。
6. 一个有效的验证技巧:结合 SQL 日志复盘流程流转
要确认 Activiti 5.22 真的按你设计的 BPMN 路径执行,光看 explorer 页面还不够。我最常用的一招是开启 MyBatis 的 SQL 日志输出,把引擎执行的每一条数据库操作都打到日志文件里。5.22 内部使用 MyBatis 作为 ORM,日志类别可以精确到 SQL 映射语句。
mybatis 日志在 5.22 里由org.apache.ibatis.logging.LogFactory管理。如果你用的是 log4j,可以在 log4j.properties 里加一行:
log4j.logger.org.activiti.engine.impl.persistence.entity=trace启动一个 3 天以上的请假流程,然后去日志里 grepACT_RU_TASK和ACT_HI_TASKINST,你会看到引擎先 insert 一条运行任务,再在流程走完时对 ACT_HI_TASKINST 执行 update 设置 end time。这比看页面上的流程图可靠得多,因为流程图只是根据历史数据渲染的结果,而 SQL 是引擎行为的直接记录。
另外一个习惯是每次调整流程定义后,都用同一个流程 key 发起一次对比测试:一期用 2 天的变量走短分支,二期用 4 天的变量走长分支。通过比较 ACT_HI_ACTINST 里的节点顺序,我能快速确认网关条件和连线是否正确。这个方法我在某图像处理 Demo 里也用到了,那时是拿它验证并行网关拆分的执行单元。
记得有一次我在设计器里改了一个网关的连线条件,但忘了重新部署模型,结果测试时流程仍然走老路径。排查了半小时才发现 ACT_RE_PROCDEF 里的版本号没变,部署 ID 还是旧的。从那以后,我每次修改流程定义都强制走一遍“保存模型 → 部署 → 在流程列表里确认版本号递增 → 发起新流程”四步操作。希望这篇基于 Activiti 5.22 完整包和 activiti-explorer.war 的实操记录,能帮你在部署、配置和排查时少走几个弯路。
本文还有配套的精品资源,点击获取