flowable 定制 jar 没进 git,lib 目录只剩一个 README:system scope 依赖缺失的排查与恢复

发布时间:2026/10/29 17:28:30
flowable 定制 jar 没进 git,lib 目录只剩一个 README:system scope 依赖缺失的排查与恢复

打开 3liantieerji 后台管理后端项目,跑mvn package,控制台直接红屏:

[ERROR] Failed to resolve dependencies for project ...: Could not find artifact com.hbisdt:flowable-engine-common:jar:6.7.2 in ... systemPath .../lib/flowable-engine-common-6.7.2.jar does not exist

两个 jar 都走 system scope,指向项目内lib/目录。我ls lib/,里面只有一个 README.md,jar 文件压根不在。编译和打包全卡在这里。

system scope 的 jar 为什么丢了

先看 README 写了什么。里面说得很直白:lib 里放的是修改过源码的 flowable 工作流定制包,主要兼容金仓和达梦数据库。但 jar 本身没进 git——大概率是.gitignore里把lib/*.jar排掉了,或者有人图省事只提交了 README 当占位。

我顺手对比了同仓库下的 sj-server 项目。sj-server 是精简版,没有工作流模块,pom 里根本不需要 flowable 和 liquibase,所以它编译没问题。这解释了为什么只有全功能后台会挂。

关键判断:这两个 jar 不是 Maven Central 能直接拉下来的标准版本,是内部改过源码的定制包。就算网络通、Maven 镜像配好了,systemPath指向本地目录,Maven 不会帮你下载。

定制 jar 从哪来:跨项目找备份

恢复路径其实只有一条:找到同一套定制包的备份。我在全流程项目(另一个更大的工程)的lib/目录下搜了一下,两个 jar 都在:

  • flowable-engine-common-6.7.2.jar
  • liquibase-core-4.5.0.jar

校验方式不复杂:对比两边的 README.md 文案一致,jar 大小相同,确认是同一套定制版本。直接cp到 3liantieerji 的lib/目录下,重新mvn package,依赖解析这层过了。

第二层编译错误:DTO 类缺失

依赖通了之后,编译还是红。这次报错在SysDictManagerServiceImpl.java:

[ERROR] .../SysDictManagerServiceImpl.java:[xx,x] cannot find symbol: variable DictManageImportDTO location: package com.hbisdt.dqbasic.kernel.business.basic.dict.pojo.response

DictManageImportDTO这个类在com.hbisdt.dqbasic.kernel.business.basic.dict.pojo.response包下,但当前项目里找不到。排查方向:

  • 这个类来自哪个依赖 jar?大概率是dqbasic-kernel相关的内部包,需要确认版本是否匹配
  • 同文件里是否还有其他引用了同一个包下但本地不存在的类(截断处线索指向"同文件里 Di…",推测还有同类缺失)
  • 检查mvn dependency:tree看这个内部依赖到底有没有被正确引入

这一步还没走完,但定位思路清晰:system scope 的依赖问题解决了,接下来是普通 compile scope 下内部包版本不对齐的问题。

可带走的三条排查路径

碰到systemPath下 jar 缺失,别急着去 Maven 中央仓库找。按这个顺序走:

  1. 先看 lib 目录和 README——确认文件是缺失还是根本没提交,README 通常会说明 jar 的来源和定制点
  2. 找同仓库/同团队其他项目的备份——定制包往往在多个项目间共享,find / -name "flowable-engine-common-6.7.2.jar"或直接在同事机器上拉一份
  3. 用mvn dependency:tree区分 system scope 和普通依赖——system scope 的 jar 不会因为-U强制更新而自动下载,必须本地文件存在

最后一条教训写进项目 README 或 CI 配置里:system scope 依赖必须在构建前做文件存在性检查([ -f lib/xxx.jar ] || exit 1),否则每次新人 clone 完就红屏,排查成本全花在找 jar 上了。


做自动化这几年,最耗时间的从来不是写代码,是摸清每个平台的脾气。

这篇里提到的坑,都是真金白银踩出来的。
如果你手上也有重复度很高的活儿——批量发布、数据搬运、有固定规则的机械操作
——可以在评论区说说你的场景,我看看能不能自动化掉。