maven关于pom中设置repository不起作用的原因排查

  • Post author:
  • Post category:其他


自己在使用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都跳转到该镜像下。



版权声明:本文为LabDNirvana原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。