1. 这个报错到底在说什么:先看懂Maven的“依赖寻址”规则
如果你在命令行里执行 mvn clean package,最终看到一排类似的输出:
code复制[ERROR] Failed to execute goal on project demo-service: Could not resolve dependencies for project com.example:demo-service:jar:1.0.0: The following artifacts could not be resolved: org.apache.commons:commons-lang3:jar:3.12.0 (central): Failure to transfer org.apache.commons:commons-lang3:jar:3.12.0 from https://repo.maven.apache.org/maven2 was cached in the local repository. Resolution will not be reattempted until the update interval of central has elapsed or updates are forced.
这一大段英文,实际上只传达了三层意思:
- Maven 在解析
org.apache.commons:commons-lang3:3.12.0这个依赖的时候失败了。 - 它尝试从某个远程仓库下载,但没有成功。
- 本地仓库里缓存了一个“失败标记”,在指定的更新间隔内,Maven 不会再次尝试下载。
很多人第一反应是“网络断了”,于是拼命检查网线。但根据我这几年带项目、帮同事排错的经历,这个报错的原因远不止网络一种。真正要解决它,你先得搞清楚 Maven 的依赖寻址流程。
Maven 找依赖,永远是 本地仓库优先,找不到才去远程仓库拉。本地仓库默认在用户目录下的 .m2/repository 文件夹里,例如 Windows 下是 C:\Users\你的用户名\.m2\repository,Linux/macOS 下是 ~/.m2/repository。
它的寻址逻辑其实非常“死板”:根据依赖的 groupId、artifactId、version 生成一个相对路径,然后去这个路径下找对应的 jar 文件。比如上面那个依赖,Maven 会去找 ~/.m2/repository/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar。
如果这个 jar 不存在,它就根据 settings.xml 里配置的镜像地址去远程仓库下载。下载成功,jar 放入本地仓库,后续编译打包都从本地读;下载失败,它会在 jar 旁边生成一个 .lastUpdated 后缀的标记文件,记录这次失败。下次构建时,Maven 发现这个标记文件还没过期,就直接拒绝再次下载。
注意:很多人看到
.lastUpdated文件不知道是什么,其实那是 Maven 的“失败记忆”。删掉它,Maven 才会重新尝试下载。这个后面我会专门讲。
所以,遇到 The following artifacts could not be resolved,你脑子里要立刻浮现这张“地图”:本地仓库有没有 → 远程仓库能不能连 → 下载的文件对不对 → 坐标到底存不存在。这条链路捋清楚,排查效率会高得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最常见的“元凶”:网络、镜像与仓库配置
我统计过自己项目里遇到的这个报错,超过六成是 网络和仓库配置 问题。尤其是公司内部网络环境、刚入职新项目、或者换了一台新电脑的时候,最容易踩坑。
2.1 中央仓库被墙,换镜像最省事
Maven 默认的中央仓库地址是 https://repo.maven.apache.org/maven2。如果你的网络访问这个地址很慢或者干脆超时,依赖下载就会失败,然后报出文章开头那条错误。
解决方案是配置国内镜像。目前用得最多的是阿里云镜像,修改 ~/.m2/settings.xml,在 <mirrors> 节点里加这么一段:
xml复制<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
注意 <mirrorOf>central</mirrorOf> 表示这个镜像只拦截中央仓库的请求,不影响你配置的其他仓库。我见过有人图省事,写成 <mirrorOf>*</mirrorOf>,结果私服里的内部依赖也全被镜像拦走,导致更奇怪的报错。
2.2 私服配置的坑:id 对不上,认证全白搭
如果你是公司项目,
