这是一条 Activiti 7.1.0.M6 的历史升级记录。相同业务代码在旧环境可以运行,升级后访问流程定义,却出现:
Process definition with the given id: '...'
belongs to a different application version.
异常里虽然带着流程定义 ID,但问题不一定在 BPMN 节点或 Java 业务逻辑,而可能是运行应用与流程定义的版本身份没有对应起来。
从入门教程转向版本配置
当时入门教程中没有找到这个错误的解释,继续查版本信息后,排查方向转到了项目 manifest。相关配置项是:
project.manifest.file.path
注意拼写是 manifest,不是 mainifest。它指定项目清单文件的位置。项目中既要有清单文件,也要让实际启动配置指向该文件;只把一个 JSON 放进资源目录,并不能确认运行应用已经读取它。
使用与依赖版本一致的示例
官方示例仓库保留了 7.1.0.M6 的应用配置 和 default-project.json。示例清单包含项目的 id、name、version 等元数据;其中 version 的示例值是字符串 "1"。
应把这些文件作为同版本配置结构的参考,而不是照搬示例项目的 ID 和名称,也不要拿持续变化的 master 分支当作旧版本配置依据。清单表示的是当前项目身份,不能为了绕过错误而随机更换。
三种“版本”不要混为一谈
排查时至少区分:
- Maven 中引擎和 runtime 组件的依赖版本,例如 7.1.0.M6。
- 项目 manifest 中的项目身份与项目版本。
- 引擎部署记录中的流程定义 ID、key 和版本。
依赖升级、项目清单变化和重新部署流程不是同一个动作。仅重新上传同一份 BPMN,不能保证应用版本的限制就被消除。
当年的处理是补充项目清单并配置路径,随后恢复使用。对于已有数据的系统,仍应先记录实际生效的配置、当前部署和异常中的定义 ID,确认它属于哪个应用版本,再选择正确的运行应用或部署路径。
一个安全的检查顺序
- 核对实际启动的环境配置,确认路径属性没有被外部配置覆盖。
- 检查构建产物是否包含目标 JSON,而不只是源码目录中存在文件。
- 对照同版本示例检查清单结构和项目身份。
- 将错误中的流程定义 ID 与部署记录对应,确认不是访问了另一应用或另一轮部署。
- 在保留历史数据的测试环境中验证修改,分别检查新发起流程与已有实例。
不要把直接修改引擎表、删除旧部署或重新创建项目身份作为通用解法。那些操作可能破坏已有实例与定义之间的关系。遇到这个错误,先沿“应用—项目清单—流程部署”的版本边界定位,比反复改 BPMN 更有针对性。