问题排查:Maven编译无法获取SNAPSHOT包

2,334 阅读2分钟

碰到的问题

最近,碰到一个问题,编辑项目的时候,一直提示找不到snapshot的jar包,但是私服上却有相应的jar包。

报错如下:

私服上存在相应的构件:

settings配置的镜像如下:

排查思路1(失败)

发现私服上,不存在framework-2.0.1-SNAPSHOT.jar这个构件,是不是deploy的命令有问题呢?

通过搜索后发现,默认情况下,当deploy一个snapshot版本的构件到仓库时,会自动带上时间戳后缀, 可以通过 -DuniqueVersion=false 这个命令解决。文章如下disabling-timestamps-suffix

尝试后发现,并没有解决问题,继续搜索后发现,这个命令已经在maven3废弃了。

排查思路2

无奈只能调试maven源码,在Maven解析framework-2.0.1-SNAPSHOT.jar这个构件,获取对应的远程仓库metadata文件时,却发现,这个远程仓库不支持snapshot,所以无法拉取对应的metadata文件,当然也就无法找到构件了。代码在 DefaultMetadataResolver#isEnabled

原来是我没有配置项目的远程仓库地址,Maven默认给我添加了一个central仓库,并且这个仓库是不支持snapshot获取构件。虽然被镜像替换了id和url,但是snapshotPolicy是不变的,还是不支持snapshot,就不会去镜像仓库获取对应的jar包。

解决方案

在settings中启用远程仓库,如下:

编译通过~

Maven仓库和镜像

仓库

基于坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以再某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。

镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。

需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。

总结

排查了整整一天,主要是还是因为不清楚maven查找snapshot构件的流程。