关于 dependency-conflict-resolver
面向 Kotlin 和 Spring 开发者的技能,用于追踪 Gradle 依赖冲突的版本来源,并提出范围明确、可验证的修正方案。
主要功能
- 01追踪依赖解析版本
- 02识别胜出的依赖路径
- 03定位版本管理来源
- 04建议最小修复
- 05制定验证检查
适用场景
- 01诊断运行时链接错误
- 02对齐版本管理失当的库系列
- 03解决跨模块反复出现的冲突
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jetbrains/ skills --skill dependency-conflict-resolver安装后在 Claude Code 中输入/dependency-conflict-resolver确认已加载。
附带文件agents/openai.yaml
详细介绍
依赖冲突解析器
来源映射:源自 Kotlin_Spring_Developer_Pipeline.md(SK-05)的 2 级高价值技能。
使命
找出实际生效的制品版本、它生效的原因,以及范围最小且安全的修正方案。 将依赖冲突解析视为版本归属问题,而不是猜测竞赛。
首先阅读
./gradlew dependencies或指定模块的 dependencies 输出。- 对发生故障的库系列运行
./gradlew dependencyInsight --dependency <artifact>。 - 根目录和模块的构建文件、版本目录、导入的 BOM,以及插件版本。
- 确切的运行时或编译时错误:
NoSuchMethodErrorClassNotFoundExceptionNoClassDefFoundErrorAbstractMethodError- 重复绑定警告
按以下顺序诊断
- 确定发生故障的类或方法所属方。
- 确定哪个制品提供了该类。
- 确定依赖图中的所有候选版本。
- 确定生效的版本及其生效原因:
- 直接依赖
- BOM 或平台
- 版本目录别名
- 传递依赖
- 冲突解析规则
- 确定应负责管理该系列的真正版本归属方。
高级类路径陷阱
- 编译时构建成功,但运行时出现链接错误,通常意味着已解析的制品之间存在二进制不兼容,而非缺少导入。
- Jackson、Netty、SLF4J、Logback、Kotlin stdlib 和 Hibernate 系列通常应作为整体对齐版本,而不是逐个修补制品。
- 插件类路径和应用程序类路径是两个不同的世界。升级插件可能无法解决运行时库冲突,反之亦然。
- 测试运行时可能与主运行时不同。仅在测试中出现的冲突可能来自测试夹具、模拟库或测试容器支持库。
enforcedPlatform、strictly和排除项可以解决冲突,也可能悄无声息地将依赖图锁定在脆弱状态。应谨慎使用。- 多个日志绑定通常会在彻底失败之前,就导致令人困惑的启动行为。
- 在普通的 Spring Boot 应用中,着色或重定位很少是首选方案。只有确实需要类路径隔离时才考虑使用。
Gradle 解析细节
- 基于变体的解析可以根据用途、JVM 版本和能力等属性选择制品。依赖即使“存在”,也可能解析到了错误的变体。
- 即使声明的版本看起来合理,BOM 导入顺序和多个平台也可能微妙地改变最终生效的系列。
- 共享模块中
api与implementation的依赖泄漏,可能导致冲突只在下游使用方中出现。 - 重新打包或重定位的 JAR 中存在的重复类,可能直到运行时类加载或自动配置扫描时才显现。
- 注解处理器、KSP 和插件类路径可能需要与主应用运行时分别对齐。
专家经验法则
- 如果症状仅在运行时出现,应检查打包后的制品或运行时类路径,而不只是 IDE 依赖树。
- 如果某个库系列由 Spring Boot 管理,优先将版本管理权交还给 BOM,而不是添加更多本地版本固定。
- 如果同一冲突在多个模块中反复出现,应在平台或约定层解决,而不是逐个修补模块。
- 如果某项依赖看起来未使用,在移除前应先确认是否通过反射、自动配置或服务加载器使用。
首选解决策略
- 如果 BOM 已管理兼容版本,优先移除不必要的显式版本。
- 优先对齐整个受影响的依赖系列。
- 如果确实需要覆盖版本,优先采用直接且有文档说明的版本覆盖,而不是隐藏的排除项。
- 仅当某项依赖确实不适用于该模块时才使用排除项,而不是仅仅因为它带来不便。
- 说明为何应由所选层级管理该版本,避免下次升级时冲突再次出现。
输出约定
返回以下部分:
Conflict summary:说明冲突的内容,以及症状出现的位置。Winning path:说明如何选择已解析的制品版本。Version authority:说明应由哪个文件或平台负责修复。Minimal fix:说明最小且安全的依赖或平台变更。Verification:说明用于确认依赖图正常的编译时和运行时检查。
护栏
- 不要在未追溯现有兼容性模型的情况下臆造版本号。
- 不要为了让依赖图变为绿色而随意添加排除项。
- 不要默认使用
force。 - 如果整个库系列的版本都不一致,不要只修复表面上失败的制品。
质量标准
优秀的执行结果会说明冲突路径,并在正确的权威层级解决冲突。 糟糕的执行结果会添加一次性的版本固定,让代码今天可以编译,却在下一个分支中再次引发同样的冲突。
评论
支持 Markdown