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学习笔记(二)-仓库

Maven学习笔记—仓库的更多相关文章

  1. maven 学习笔记--仓库,聚合和继承,私服搭建

    仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...

  2. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  3. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  4. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  5. MAVEN学习笔记之基础(1)

    MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...

  6. MAVEN学习笔记之Maven插件的应用(4)

    MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...

  7. MAVEN学习笔记之私服Nexus(2)

    MAVEN学习笔记之私服Nexus(2) 私有服务器搭建 Nexus www.snatype.org下载 snatype-work 是默认nexus存储nexus a:将bin添加到环境中 Admin ...

  8. Maven 学习笔记(二)

    前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...

  9. Maven学习笔记-01-Maven入门

    一 Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1  项 ...

随机推荐

  1. Angular 2 组件之间如何通信?

    组件之间的共享可以有好几种方式 http://learnangular2.com/outputs/ 实例参考https://angular.io/docs/ts/latest/cookbook/com ...

  2. hdu 4597 Play Game(记忆化搜索)

    题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp ...

  3. Ionic学习笔记3_ionic指令简单布局

    1)   添加引用类库(ionic样式和ionic js文件) 2)   标题栏,页脚栏,内容区 3)   Js引入ionic类库,添加页面操作方法和对象 4)   数据初始化 5)   Html页面 ...

  4. centos7+nginx部署asp.net core mvc网站

    1. 安装 .net core 可参见官网安装教程. 选择Linux发行版本为Centos/Oracle 添加dotnet的yum仓库配置 $ sudo rpm -Uvh https://packag ...

  5. fstream之seekp/seekg/ios::ate/ios::app

    在程序开发中,IO处理无处不在,经常会在代码中遇到特殊的IO处理需求 1.描述 需求:如果文件不存在则创建,存在则打开,然后先读取文件的末行,然后在文件末尾写入. 代码: #include <i ...

  6. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  7. linux下使用Stunnel配置与使用方式一例

    第一部分:stunnel的安装与配置 注:在ubuntu下,stunnel的安装很简单快捷. 在synaptic(安立得工具系统下可以直接选举安装) 在服务器环境下,直接使用apt-get insta ...

  8. setTimeout里无法调用鼠标事件的event

    问题的由来是下面这段代码: middleOnmouseLeave: function (event) { setTimeout(function () { event.currentTarget.st ...

  9. 【转发】linux开发人员常用命令

    每个开发人员到了他们职业人生的某个阶段的时候,将会发现自己要寻找有关Linux的信息.我并不是这方面的专家.但是掌握了以下8个命令,我几乎可以得到我任何需要的东西. 注意:以下的命令都有很多扩展的文档 ...

  10. Python+selenium打开或关闭浏览器

    Python+selenium打开或关闭浏览器 一.打开或关闭火狐浏览器 1.       初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打 ...