仓库分类
仓库主要分类:
- 本地仓库:本地磁盘, 不需要启动服务,默认路径
~/.m2/repository
- 远程仓库:启动了一个仓库服务进程,提供存放、拉取jar包的能力
- 镜像仓库:可以理解为缓存,跟指定的源仓库保持一致
其他概念:
- 私服:就是一个远程仓库,只不过离我们比较近,一般在局域网内
- 中央仓库:也是一个远程仓库,全球共享,离我们比较远
- 聚合仓:把两个仓库的资源合并在一个仓库里
现实中的产品:
nexus,既可以作为私服,同时也提供镜像的能力
分别创建一个host类型的和一个代理类型的仓库,
然后创建一个聚合仓,在拉取时从代理仓拉去,在deploy时deploy到host仓
使用上的问题
- 如何正确配置mirrors?
- 如何正确配置私服(远程仓)?
正确姿势
这部分主要分三点
- 在pom中配置远程仓库
- 在settings中配置远程仓库
- 正确使用mirror
前两点配置远程仓,也是配置私服
在pom中配置远程仓库
在pom.xml的repositories标签中可以配置多个远程仓库,maven如果发现本地仓库没有的依赖都会尝试从远程仓库拉取,按顺序并发请求多个远程仓库
<project>
<repositories>
</repositories>
</project>
在settings中配置远程仓库
如果项目工程多了,每个项目都要在pom中配置远程仓库,繁琐、重复
在settings.xml的profiles标签中配置多个远程仓库,效果和在pom配置多个远程仓时一样的
<settings>
<profiles>
<profile>
<id>common</id>
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>common</activeProfile>
</activeProfiles>
</settings>
正确使用mirror
添加阿里的镜像,注意不要使用<mirrorOf>*</mirrorOf>
<settings>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>
<settings>
关于mirrorOf的作用
当远程仓(不管你是在pom还是在settings中配置的)被镜像配置匹配上的时候,实际使用的将是镜像仓
关于使用<mirrorOf>*</mirrorOf>
的坑
如果在mirrors中的第一个mirrorOf使用了*,并且没有使用其他排除表达式,将会导致后面的mirror失效,因为maven只会使用第一个匹配上的mirror
如何解决无法下载依赖 (示例)
环境:
- pom.xml没有配置任何远程仓
- settings.xml只加了mirrorOf central 映射到 阿里镜像
假设项目需要用到依赖
<dependency>
<groupId>cascading.avro</groupId>
<artifactId>avro-scheme</artifactId>
<version>2.1.2</version>
</dependency>
执行mvn clean package -DskipTests
触发拉取依赖失败
在中央仓库搜索该jar包
选择版本后有提示this artifact is located at Spring Plugins repository (https://repo.spring.io/plugins-release/)
说明这个jar包没有发布到中央仓库,而是在一个叫Spring Plugins的仓库中
解决办法就是添加远程仓,在pom中或者settings中添加都可以
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。