27 March 2017

Jenkins 构建失败时,日志里出现了一长串依赖名,真正指向问题的却是 Could not find metadata org.jetbrains:annotations-java5/maven-metadata.xml。先找到最具体的失败对象,比直接清空整个本地仓库更有效。

沿着异常链找到坐标

当时解析失败的依赖是 org.jetbrains:annotations-java5:jar:RELEASE。RELEASE 是动态版本标识,需要版本元数据,不像固定版本那样能直接确定目标文件。

mvn package -e
mvn dependency:tree

先检查引入路径、仓库地址、镜像和 settings.xml,再确认本地缓存及网络是否正常。mvn 是 Maven 命令,不能写成 maven;是否跳过测试与依赖解析失败是不同问题。

只修复已定位的缓存

这次清理对应依赖的本地缓存后重新下载,构建恢复。但恢复结果不意味着所有元数据错误都来自缓存:远端缺失、代理错误和权限限制也可能出现类似现象。

修改缓存前确认实际本地仓库位置,只处理目标 group/artifact,不删除整个仓库。-U 可以要求更新检查,但不能修复一个本来就不存在的依赖,也不应反复重试而忽略具体 HTTP 错误。

让构建可重复

把依赖固定到经过验证的版本,检查是否由传递依赖引入动态版本,并通过 dependencyManagement 等方式统一管理。CI 的 Maven、JDK、镜像和认证配置也应可追溯。

最终在干净缓存或隔离的构建环境验证,避免“开发机缓存里恰好有包”被误认为仓库配置正确。分享调试日志前,只保留必要的错误与坐标。

参考:Maven 依赖机制。





blog comments powered by Disqus
Fork me on GitHub