Maven仓库

1 什么是Maven仓库

在Maven中,任何一个依赖、插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Maven仓库。

Maven项目不会各自存储依赖文件(通常是jar文件),只需要声明这些依赖的坐标,在需要的时候,Maven会自动根据坐标找到仓库中的构件,并使用它们。

如果项目之间存在依赖关系,项目构建完毕后生成的构件也可以安装部署到Maven仓库中,供其他项目使用。

2 仓库的分类

对于Maven来说,仓库只分为两类:本地仓库和远程仓库。

Maven寻找构件时,首先从本地仓库找,如果找到了则直接使用,找不到则到远程仓库找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都找不到,Maven就会报错。

中央仓库是 Maven 核心自带的远程仓库,它包含了绝大部分开源的构件,默认地址:http://repo1.maven.org/maven2。除了中央仓库,还有其它很多公共的远程仓库。

私服是架设在本机或局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库。

2.1 本地仓库

Maven 本地仓库默认地址为:${user.home}/.m2/repository。

如果想要自定义仓库的目录地址,需要编辑Maven的settings.xml文件:

<localRepository>D:\Program Files\apache-maven-3.5.0\repository</localRepository>

2.2 中央仓库

安装完 Maven ,本地仓库几乎是空的,这时需要从远程仓库下载所需构件。Maven 配置了一个默认的远程仓库,即中央仓库。

找到 %MAVEN_HOME%/lib/maven-model-builder-3.5.0.jar,打开 org/apache/maven/model/pom-4.0.0.xml,下面这段配置文件是所有Maven项目都会继承的超级POM:

2.3 远程仓库的配置

当中央仓库找不到所需的构件时,我们可以配置 pom.xml,添加其它的远程仓库。

<repositories>
<repository>
<id>maven-repo2</id>
<name>maven-repo2</name>
<url>http://repo2.maven.org/maven2/</url>
</repository>
<repository>
<id>maven-local</id>
<name>maven-local</name>
<layout>default</layout>
<url>http://172.16.100.3:8087/nexus-service/content/groups/public/</url>
</repository>
</repositories>

在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库,其中id必须唯一,若将id设置为central将覆盖中央仓库的配置。

2.3.1 远程仓库的认证

大部分远程仓库无需认证就可以访问,但有时候处于安全方面的考虑,我们需要提供认证信息才能够访问一些远程仓库。认证信息需要在settings.xml文件中配置:

<servers>
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
</servers>

Maven使用servers元素及其子元素server配置仓库的认证信息。其中id必须与pom中需要认证的repository元素的id完全一致。username和password表示认证时需要提供的用户名和密码。

2.3.2 部署至远程仓库

Maven能够将项目生成的构件发布到远程仓库中,供其他团队成员使用。发布构件需要在pom文件中进行配置:

<distributionManagement>
<repository>
<id>releases</id>
<url>http://172.16.100.3:8087/nexus-service/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://172.16.100.3:8087/nexus-service/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>

distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。

这两个元素下都需要配置id、name、和url,id为远程仓库的唯一标识,name是为了方便阅读,url表示仓库的地址。

往远程仓库发布构件的时候,往往需要认证,之前已经讲过,就是需要在settings.xml中配置server元素,其id与仓库的id匹配。

当配置完成后,运行Maven命令:mvn clean deploy,Maven就会将项目构建输出到对应的远程仓库。

3 镜像

如果仓库X可以提供仓库Y的所有内容,那么就可以认为X是Y的一个镜像。也就是说,任何一个可以从仓库Y中获得的构件,都可以从它的镜像中获得。可以通过编辑settings.xml文件来配置镜像:

<mirrors>
<!-- 阿里云仓库 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>

Maven使用mirrors元素及其子元素mirror配置仓库的镜像,其中<mirrorOf>的值表示该mirror是哪个仓库的镜像,例子中<mirrorOf>的值为central,表示该mirror为中央仓库的镜像,任何对中央仓库的请求,都会转至该镜像。

id、name、url和一般仓库的配置无异,表示镜像仓库的唯一标识、名称和地址。

类似的,如果镜像需要认证,也可以基于该id配置仓库认证。

为了满足一些复杂的需求,Maven还支持更高级的镜像配置:

  • <mirrorOf>*</mirrorOf>:匹配所有远程仓库
  • <mirrorOf>external:*</mirrorOf>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外,也就是说,匹配所有不在本机上的远程仓库。
  • <mirrorOf>repo1,repo2</mirrorOf>:匹配仓库repo1和repo2,使用逗号隔开多个远程仓库。
  • <mirrorOf>*,!repo1</mirrorOf>:匹配所有远程仓库,repo1除外。使用感叹号将仓库从匹配中排除。

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

参考:

《Maven实战》

Maven学习笔记(二)-仓库

最新文章

  1. Unity自动寻路入门指南
  2. JAVA程序员一定知道的优秀第三方库(2016版)
  3. Codeforces Round #292 (Div. 2) C. Drazil and Factorial
  4. JavaScript判断是否是手机mobile登录
  5. 关于Autoit上传文件的问题
  6. js 导出Excel
  7. 安装memcached服务器和PHP中添加memcache拓展模块
  8. POM的配置文件
  9. POJ2513Colored Sticks
  10. PowerDesigner 生成带凝视SQL 各个版本号通用10(12、15)
  11. 经典SQL语句集锦
  12. 配置greenplum参数
  13. 访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)
  14. UVa 11408 - Count DePrimes
  15. css 实现旋转八卦图
  16. 浅析Memcache和Redis
  17. 字王大藏经体v0.1概念版
  18. appium---android元素定位
  19. 对象何时进入老年代、何时发生full gc
  20. MySQL的sql_mode模式说明及设置

热门文章

  1. Atitit.java相比c#.net的优点 优缺点 &#160;v2 q330
  2. Atitit.java&#160;swing打印功能&#160;api&#160;&#160;attilax总结
  3. Atitit.数据库表的物理存储结构原理与架构设计与实践
  4. 简单使用shell 自动打包,发布项目 脚本
  5. vue 深入响应式原理
  6. iOS swift 代理协议
  7. nc在centos7上的安装和简单使用
  8. Death to Binary? 分析模拟
  9. Linux Linux常用命令二
  10. ThinkPHP与EasyUI整合之三(searchbox):在datagrid中查询指定记录