
jqassistant 在多 spring boot 项目共用 neo4j 数据库扫描时,因插件版本过旧(1.10.1)导致 cypher 查询异常(shortestpath 同节点报错),升级至 1.12.2+ 命令行版并禁用数据库重置即可安全聚合分析跨项目 api 调用与循环依赖。
jqassistant 在多 spring boot 项目共用 neo4j 数据库扫描时,因插件版本过旧(1.10.1)导致 cypher 查询异常(shortestpath 同节点报错),升级至 1.12.2+ 命令行版并禁用数据库重置即可安全聚合分析跨项目 api 调用与循环依赖。
在微服务或模块化 Java 架构中,使用 jqAssistant 统一建模多个 Spring Boot 应用的代码结构、API 调用链及潜在循环依赖,是提升系统可观测性与架构治理能力的有效实践。但实践中常遇到一个典型问题:首个项目扫描成功,后续项目扫描却抛出 DatabaseException: The shortest path algorithm does not work when the start and end nodes are the same —— 这并非数据污染或命名冲突所致,而是 jqAssistant Maven 插件 1.10.1 版本内置的 Neo4j 驱动与 Cypher 查询逻辑存在已知缺陷。
该错误源于插件在执行图分析(如 shortestPath)前未充分过滤笛卡尔积产生的自环路径(即 startNode = endNode)。尽管你已通过 <configuration><resetdatabase>false</resetdatabase></configuration> 正确禁用数据库重置以支持多项目累积扫描,但旧版插件生成的底层 Cypher 查询(如你提供的 UNWIND $batch ... CREATE (n:File:Directory:Package:Java))在高并发/多批次写入场景下,会触发 Neo4j 5.x+ 默认启用的安全策略 cypher.forbid_shortestpath_common_nodes=true,从而中断构建流程。
✅ 根本解决方案不是修改配置或绕过校验,而是升级工具链:
根据官方实践与用户验证(@dirk-mahler),jqAssistant Maven 插件 1.10.1 存在多个与 Neo4j 5+ 兼容性相关的未修复 Bug,包括但不限于:
- 批量节点创建时未正确处理重复
fqn上下文边界; -
shortestPath分析器未对MATCH (a)-[r*]->(b)中的a和b做WHERE a b显式约束; - 与 Spring Boot 3.x(基于 Jakarta EE 9+)的字节码解析兼容性不足。
因此,推荐采用 “命令行驱动 + 插件降级”组合方案,既规避 Maven 生命周期耦合风险,又确保稳定性:
✅ 推荐实施步骤(生产就绪)
卸载旧版 Maven 插件
从所有子模块pom.xml中移除jqassistant-maven-plugin声明,避免干扰。-
统一使用 jqAssistant CLI 1.12.2+(推荐 1.13.0)
下载地址:https://www.php.cn/link/97d34c42010dcbf436a0aaca60751d73
验证版本:jqassistant --version # 应输出 1.12.2 或更高
-
为每个项目独立扫描,共享同一 Neo4j 实例
# 第一个项目(初始化数据库) jqassistant scan -f target/classes -s src/main/java -d ~/.jqassistant/neo4j # 后续项目(追加模式,自动复用已有图谱) jqassistant scan -f ../service-a/target/classes \ -s ../service-a/src/main/java \ -d ~/.jqassistant/neo4j \ --skip-initialization -
执行跨项目分析(示例:查找跨服务 API 调用)
MATCH (c:Class)-[:INVOKES]->(m:Method) WHERE c.fqn STARTS WITH 'com.mycompany.client' AND m.fqn STARTS WITH 'com.mycompany.service' RETURN c.fqn AS clientClass, m.fqn AS serviceMethod, count(*) as invocations ORDER BY invocations DESC LIMIT 20
⚠️ 重要注意事项
- ❌ 不要尝试通过 Neo4j 配置
cypher.forbid_shortestpath_common_nodes=false临时规避——这会掩盖真实架构问题(如意外的自调用),且违反安全最佳实践; - ✅ 所有项目必须使用相同 JDK 版本与字节码级别(建议统一 JDK 17+),否则
Class节点的bytecodeVersion属性不一致将导致关系匹配失效; - ? 若仍需 Maven 集成,可改用
jqassistant-maven-plugin:1.13.0(2026 年 7 月发布),其已同步 CLI 端全部修复,并支持<scanmode>APPEND</scanmode>显式声明累积模式。
总结:多项目 jqAssistant 扫描失败,表面是 Neo4j 的 Cypher 异常,实质是工具版本滞后引发的兼容性雪崩。一次精准升级(1.10.1 → 1.13.0+),即可将“玄学报错”转化为可复现、可审计、可扩展的架构洞察力。真正的工程效率,永远始于选择被持续维护的现代工具链。










