使用jqassistant扫描Spring Boot Jar时遇java.lang.LinkageError求助
排查jqassistant扫描Spring Boot Jar时的ANTLR版本冲突问题
问题背景
使用com.buschmais.jqassistant.cli-jqassistant-commandline-neo4jv4-2.1.0.jar扫描Spring Boot Jar,.jqassistant.yml配置如下:
jqassistant: skip: false plugins: - group-id: org.jqassistant.plugin artifact-id: jqassistant-spring-plugin version: 2.1.0-M1 - group-id: org.jqassistant.plugin artifact-id: jqassistant-plantuml-report-plugin version: 2.0.1 store: embedded: neo4j-plugins: - group-id: org.neo4j.procedure artifact-id: apoc version: 4.4.0.25 scan: include: files: - Projects/jqassistant-springboot-project/libs/invoiceservice.jar properties: file.exclude: /BOOT-INF/lib/** reset: true continue-on-error: true analyze: report: fail-on-severity: BLOCKER groups: - microservices
执行./jqassistant/bin/jqassistant.sh scan时出现ANTLR版本不匹配警告及java.lang.LinkageError,此前扫描正常,尝试指定ANTLR 4.9.2运行时版本后问题仍未解决。
排查与解决方案
1. 统一插件与核心版本
jqassistant核心版本为2.1.0,但spring插件使用里程碑版本2.1.0-M1,plantuml插件使用旧版本2.0.1,版本不一致极易引发依赖冲突。
- 修改配置,将插件版本统一为2.1.0正式版:
plugins: - group-id: org.jqassistant.plugin artifact-id: jqassistant-spring-plugin version: 2.1.0 - group-id: org.jqassistant.plugin artifact-id: jqassistant-plantuml-report-plugin version: 2.1.0
2. 强制锁定ANTLR依赖版本
即使手动指定ANTLR版本,也可能被插件的传递依赖覆盖,需在配置中强制锁定版本:
- 在
.jqassistant.yml中添加全局依赖规则:jqassistant: # 保留原有配置... dependencies: - group-id: org.antlr artifact-id: antlr4-runtime version: 4.9.2 scope: runtime - group-id: org.antlr artifact-id: antlr4 version: 4.9.2 scope: compile - 执行依赖树分析,确认版本是否生效:
./jqassistant/bin/jqassistant.sh dependency:tree | grep -i antlr
3. 验证Spring Boot Jar排除规则
虽然配置了file.exclude: /BOOT-INF/lib/**,但可能因规则未生效导致嵌套Jar中的ANTLR干扰扫描:
- 开启DEBUG日志验证排除规则:
scan: # 保留原有配置... logging: level: DEBUG - 尝试解压Spring Boot Jar后扫描目录,彻底避免嵌套依赖影响:
scan: include: directories: - Projects/jqassistant-springboot-project/libs/invoiceservice-unpacked
4. 清理环境类路径污染
系统CLASSPATH环境变量可能包含其他版本的ANTLR,导致加载冲突:
- 查看当前CLASSPATH:
echo $CLASSPATH - 清空CLASSPATH后重新执行扫描:
unset CLASSPATH && ./jqassistant/bin/jqassistant.sh scan
5. 排查APOC插件依赖冲突
APOC 4.4.0.25可能依赖特定版本的ANTLR,与jqassistant依赖冲突:
- 尝试将APOC版本调整为与neo4jv4兼容的稳定版本,比如
4.4.0.23,验证是否解决冲突。
内容的提问来源于stack exchange,提问作者OStefanova
相关产品推荐
相关产品推荐

