自己在使用maven构建应用时,发现有一些包始终无法下载下来,后来看到该jar包一直从自己的私服上进行下载,而私服配置的是中央仓库的地址,这些包属于较偏门的,所以在中央仓库中无法找到。所以在pom中加上了自定义的repository,但再进行maven构建时,还是始终从私服地址进行下载。
问题排查
自己的maven的setting文件中关于私服镜像的配置:
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://172.xx.xx.xx:8081/repository/maven-public/</url>
</mirror>
通过
查询
得知,问题就出现在这个mirrorOf标签结点上。
链接
当maven需要到的依赖jar包不在本地仓库时, 就需要到远程仓库下载 .
这个时候如果mavensetting.xml中配置了镜像 , 而且镜像配置的规则中匹配到目标仓库时 ,
maven认为目标仓库被镜像了, 不会再去被镜像仓库下载依赖jar包, 而是直接去镜像仓库下载.
简单而言, 当通过pom文件指定的repository去下载镜像时,mirror首先通过repository的id拦截对远程仓库的请求 , 改变对目标仓库的下载地址,因为自己在这里指定的mirrorOf为*,那么所有的repository都会被该mirror拦截,从而替换成了自己的私服镜像
为了满足一些复杂的需求,Maven还支持更高级的镜像配置:
1.*
匹配所有远程仓库。
2.external:*
匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
3.repo1,repo2
匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
4.*,!repo1
匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
解决方案
<mirror>
<id>nexus</id>
<mirrorOf>*,!pom中reposiretory的Id</mirrorOf>
<url>http://172.xx.xx.xx:8081/repository/maven-public/</url>
</mirror>
意思时除了pom指定的reposiretory外所有的reposiretory都跳转到该镜像下。