maven仓库优先级

仓库分类

仓库主要分类:

  • 本地仓库:本地磁盘, 不需要启动服务,默认路径~/.m2/repository
  • 远程仓库:启动了一个仓库服务进程,提供存放、拉取jar包的能力
  • 镜像仓库:可以理解为缓存,跟指定的源仓库保持一致

其他概念:

  • 私服:就是一个远程仓库,只不过离我们比较近,一般在局域网内
  • 中央仓库:也是一个远程仓库,全球共享,离我们比较远
  • 聚合仓:把两个仓库的资源合并在一个仓库里

现实中的产品:

nexus,既可以作为私服,同时也提供镜像的能力
分别创建一个host类型的和一个代理类型的仓库,
然后创建一个聚合仓,在拉取时从代理仓拉去,在deploy时deploy到host仓

使用上的问题

  • 如何正确配置mirrors?
  • 如何正确配置私服(远程仓)?

正确姿势

这部分主要分三点

  • 在pom中配置远程仓库
  • 在settings中配置远程仓库
  • 正确使用mirror
    前两点配置远程仓,也是配置私服

在pom中配置远程仓库

在pom.xml的repositories标签中可以配置多个远程仓库,maven如果发现本地仓库没有的依赖都会尝试从远程仓库拉取,按顺序并发请求多个远程仓库


    

    

在settings中配置远程仓库

如果项目工程多了,每个项目都要在pom中配置远程仓库,繁琐、重复
在settings.xml的profiles标签中配置多个远程仓库,效果和在pom配置多个远程仓时一样的


  
    
      common
      
        
          alimaven
          aliyun maven
          https://maven.aliyun.com/repository/central
        
      
    
  
  
    common
  

正确使用mirror

添加阿里的镜像,注意不要使用*


  
    
      nexus-aliyun
      Nexus aliyun
      central
      https://maven.aliyun.com/repository/central
    
  
关于mirrorOf的作用

当远程仓(不管你是在pom还是在settings中配置的)被镜像配置匹配上的时候,实际使用的将是镜像仓

关于使用*的坑

如果在mirrors中的第一个mirrorOf使用了*,并且没有使用其他排除表达式,将会导致后面的mirror失效,因为maven只会使用第一个匹配上的mirror

如何解决无法下载依赖 (示例)

环境:

  • pom.xml没有配置任何远程仓
  • settings.xml只加了mirrorOf central 映射到 阿里镜像

假设项目需要用到依赖

        
            cascading.avro
            avro-scheme
            2.1.2
        

执行mvn clean package -DskipTests触发拉取依赖失败

在中央仓库搜索该jar包
选择版本后有提示this artifact is located at Spring Plugins repository (https://repo.spring.io/plugins-release/)

说明这个jar包没有发布到中央仓库,而是在一个叫Spring Plugins的仓库中

解决办法就是添加远程仓,在pom中或者settings中添加都可以

你可能感兴趣的:(maven)