flowable 7.x 与 spring boot 3.x 兼容,依赖 jakarta ee 9+(jakarta.);spring boot 2.7.x 需用 flowable 6.8.x(javax.)。配置需注意 schema 更新策略、历史级别、异步执行器激活及流程部署方式,变量访问须区分 getvariable() 与 getvariablelocal()。

Flowable 7.x 和 Spring Boot 3.x 兼容性问题
Flowable 7.0+ 默认依赖 Jakarta EE 9+(jakarta.* 包),和 Spring Boot 3.x 是匹配的;但如果你用的是 Spring Boot 2.7.x,必须降级到 Flowable 6.8.x,否则启动时会报 NoClassDefFoundError: javax/servlet/Filter 或 java.lang.NoClassDefFoundError: jakarta/servlet/Filter —— 这不是缺 jar,是包名断层。
- Spring Boot 2.7.x → 用
flowable-spring-boot-starter-process6.8.1,依赖javax.* - Spring Boot 3.0+ → 必须用 Flowable 7.0+,比如 7.4.0,依赖
jakarta.* - Maven 中别混用:
flowable-ui模块在 7.x 已废弃,Web 控制台要单独跑flowable-ui-app独立服务
application.yml 里最常配错的 flowable 配置项
Flowable 启动失败十次有八次出在 flowable.database-schema-update 和 flowable.history-level 的组合上。默认值看似友好,实则隐含陷阱。
-
flowable.database-schema-update: true在生产环境等于“允许删表重建”,应改为validate或false(手动建库) -
flowable.history-level: full会记录所有变量快照,日志表膨胀极快;开发可设为audit,线上建议none或activity - 没配
flowable.async-executor-activate: false?高并发下可能触发未初始化的线程池,报NullPointerException在AsyncExecutor.start()
流程定义部署后不生效的三个典型原因
调 repositoryService.createDeployment().addClasspathResource(...).deploy() 没报错,但 runtimeService.startProcessInstanceByKey("xxx") 找不到流程 —— 多半不是代码问题,而是部署路径或版本逻辑卡住了。
- 文件名带空格或中文?
addClasspathResource("请假流程.bpmn20.xml")在 Windows 下可能加载失败,改用addInputStream+getClass().getResourceAsStream() - 同 key 流程重复部署:Flowable 默认按
processDefinitionKey+version区分,旧版本不会自动停用,新实例仍可能走旧版;加.name("v2")或显式repositoryService.deleteDeployment(..., true) - XML 里
id和key混用:process id="leave"≠process key="leave";startProcessInstanceByKey()查的是key,不是id
Java Delegate 中访问变量的坑
在 JavaDelegate.execute(DelegateExecution execution) 里取变量,看似简单,但 execution.getVariable("x") 和 execution.getVariableLocal("x") 行为完全不同,尤其在多实例、子流程场景下极易出错。
立即学习“Java免费学习笔记(深入)”;
-
getVariable()向上逐级查找(当前执行流 → 父流程 → 根流程),适合读全局参数;但若子流程改了同名变量,可能读到意外值 -
getVariableLocal()只读当前执行节点绑定的变量,安全但易漏 —— 比如多实例中每个实例有自己的 local 变量副本 - 写变量优先用
setVariableLocal(),避免污染父流程上下文;除非明确要透传,才用setVariable() - 别在 delegate 里直接 new ObjectMapper(),Flowable 内置
ObjectMapper已注册ProcessEngineConfigurationImpl的序列化器,自定义会导致 JSON 序列化失败
Flowable 的“配置即行为”特性很强,很多问题表面是代码错,实际是 schema 策略、历史级别、变量作用域这些底层设定没对齐。越早确认运行时实际加载的是哪个版本的流程定义、变量存在哪一层作用域,调试效率越高。










