Maven学习笔记之仓库

来源:互联网 发布:windows 7 home basic 编辑:程序博客网 时间:2024/04/28 14:39

一、简介

  在Maven世界中,任何依赖、插件或者项目的构建的输出,都可以称为构件。任何一个构件都有一组坐标进行唯一标识。由于Maven的坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。

  实际的Maven项目将不再各自存储其依赖文件,他们只需要声明这些依赖的坐标,在需要的时候,Maven会自动根据坐标找到仓库中的构件,并使用它们。

  任何一个构件都有其唯一的坐标,根据这个坐标可以定义其再仓库中的唯一存储路径,这就是Maven的仓库布局方式。通俗的来说,Maven仓库其实就是基于简单文件系统存储的,我们将其文件夹的路径名,进行约定的标识。通常构件的路径与坐标的大致对应关系为:groupId/artifactId/version/artifactId-version.packaging。(如果对于坐标不了解的,可以参考:Maven学习笔记之坐标和依赖)

二、分类

  对于Maven来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果有则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构建之后,下载到本地仓库在使用。如果都没有需要的构件,Maven就会报错。

Maven仓库的分类如下:


2.1 本地仓库

  一般来说,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。当Maven在执行编译或测试时,如果需要使用依赖文件,他总是基于坐标使用本地仓库的依赖文件。

  默认情况下,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。注意:在Linux系统中,以点开头的文件或目录默认时隐藏的,可以使用ls-a命令显示隐藏文件或目录。

  用户自定义本地仓库目录地址。详细的更改方法可以参考:Maven学习笔记 (注意看一下上面的Maven配置)。我建议使用用户级别的配置,也就是编辑~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。如下:

<setting>...<localRepository>D:\java\repository</localRepository>...</setting>
注意:默认情况下,~/.m2/setting.xml文件是不存在的,我们需要从Maven安装目录复制$M2_HOME/conf/settings.xml文件在进行编辑。
  一个构件只有在本地仓库中之后,才能由其他Maven项目使用,构件放入到本地仓库中的方法有两种,第一种也是最常用的就是依赖Maven从远程仓库下载到本地仓库中,另一种就是将本地项目的构件安装到Maven仓库中。

2.2 远程仓库

  安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。

  当Maven无法从本地仓库找到需要的构件的时候,就会从远程仓库下载构件至本地仓库。一般地,对于Maven来说,每个用户只有一个本地仓库,但可以配置访问很多远程仓库。

2.3 中央仓库

  由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。

  中央仓库包含了这个世界上绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等,一般来说,一个简单Maven项目所需要的依赖构件都能从中央仓库下载到。更改中央仓库的细节详见:Maven学习笔记

2.4 私服

  私服是一种特殊的远程仓库,他是架设在局域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。

私服的优点:

  • 节省自己的外网带宽
  • 加速Maven构建
  • 部署第三方构件
  • 提高稳定性,增强控制
  • 降低中央仓库的负荷

2.5 远程仓库的配置

  在很多情况下,默认的中央仓库无法满足项目的需求,可能项目需要的构件存在于另一个远程仓库中。如JBoss Maven仓库。这时我们可以在POM中配置该仓库,如下:

<project>...<repositories><repository><id>jboss</id><name>JBoss Repository</name><url>http://repository.jboss.com/maven2/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots><layout>default</layout></repository></repositories>...</project>
  在repositories元素下,可以使用repository子元素声明一个或多个远程仓库。任何一个仓库声明的id必须是唯一的,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他的仓库声明也使用该id,就会覆盖中央仓库的配置。
  releases和snapshots元素是用来控制Maven对于发布版构件和快照版构件的下载。除了enableed,它们还包含另外两个子元素updatePolicy和checksumPolicy:

<snapshots><enabled>true</enabled><updatePolicy>daily</updatePolicy><checksumPolicy>ignore</checksumPolicy></snapshots>
  元素updatePolicy用来配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天检查一次。其它可用的值包括:never——从不检查更新;always——每次构建都检查更新;X——每隔X分钟检查一次更新(X为任意整数)。

  元素checksumPolicy用来配置Maven检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件的时候,Maven会验证校验和文件。如果校验和验证失败时,默认值为warn,Maven在执行构建时输出警告信息;fail——Maven遇到校验和错误就让构建失败;ignore——使Maven完全忽略校验和错误。

2.5.1 远程仓库的认证

  大部分远程仓库无须认证就可以访问,但有时候出于安全方面的考虑,我们需要提供认证信息才能访问一些远程仓库。配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中。这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机。因此,在settings.xml中配置认证信息更为安全。

假设需要为一个id为my-proj的仓库配置认证信息,编辑settings.xml文件如下:

<settings>...<servers><server><id>my-proj</id><username>repo-user</username><password>repo-pwd</password></server></servers>...</settings>
这里最关键的是id元素,settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致。换句话说,正是这个id将认证信息与仓库配置联系在了一起。

2.5.2 部署至远程仓库

  首先,我们需要编辑项目的pom.xml文件。配置distributionManagement元素,如下:

<project>...<distributionManagement><repository><id>proj-releases</id><name>Proj Release Repository</name><url>http://192.168.1.100/content/repositories/proj-releases</url></repository><snapshotRepository><id>proj-snapshots</id><name>Proj Snapshot Repository</name><url>http://192.168.1.100/content/repositories/proj-snapshots</url></snapshotRepository></distributionManagement>...</project>
  distributionManagement包含repository和snapshotRepository子元素前者表示发布版本构件的仓库,后者表示快照版本的仓库。如果需要认证,配置正确后,在命令行运行mvn clean deploy,Maven就会将项目构件输出的构件部署到配置对应的远程仓库,如果项目当前的版本是快照版本,则部署到快照版本仓库地址,否则就部署到发布版本仓库地址。

3. 其它

3.1 快照版本

  Maven的快照版本的机制,在发布的过程中,Maven会自动为构件打上时间戳,有了时间戳,Maven就能随时找到仓库中该构件版本最新的文件。默认情况下,Maven每天检查一次更新(由仓库配置的updatePolicy控制),用户也可以使用命令行-U参数强制让Maven检查更新,如:mvn clean install-U

  快照版本只应该在组织内部的项目或模块间依赖使用,因为这时,组织对于这些快照版本的依赖具有完全的理解及控制权。

  项目不应该依赖于任何组织外部的快照版本依赖,由于快照版本的不稳定性,这样的依赖会造成潜在的危险。也就是说,即使项目构件今天是成功的,由于外部的快照版本依赖实际对应的构件随时可能变化,项目的构建就可能由于这些外部的不受控制的因素而失败。

3.2 从仓库解析依赖的机制

  当本地仓库没有依赖构件的时候,Maven会自动从仓库下载;当依赖版本为快照版本的时候,Maven会自动找到最新的快照。

Maven依赖解析机制如下:

  1. 当依赖的范围是system的时候,Maven直接从本地文件系统解析构件。
  2. 根据依赖坐标计算仓库路径后尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功。
  3. 在本地仓库不存在相应构建的情况下,如果依赖的版本是显示的发布版本构件,如1.2、2.1-beta-1等,则遍历所有的远程仓库,发现后,下载并解析使用。
  4. 如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST真实的值,然后基于这个真实的值检查本地和远程仓库。
  5. 如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。
  6. 如果最后解析得到的构件版本是时间戳格式的快照,则复制时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构件。
  当依赖的版本不明晰的时候,如RELEASE、LATEST和SNAPSHOT,Maven就需要基于更新远程仓库的更新策略来检查更新。如果用户使用参数-U,强制检查更新,使用参数后,Maven就会忽略<updatePolicy>的配置。
  当Maven检查完更新策略,并决定检查依赖更新的时候,就需要检查仓库元数据maven-metadata.xml。RELEASE和LATEST版本,它们分别对应了仓库中存在的该构件的最新发布版本和最新版本(包含快照),而这两个“最新”是基于groupId/artifactId/maven-metadata.xml计算出来的。
注意:在依赖声明中使用LATEST和RELEASE是不推荐的做法,因为Maven随时都可能解析到不同的构件。
  仓库元数据并不是永远是正确的,有时候发现无法解析某些构件,或者解析得到错误构件的时候,就有可能是出现了创建元数据错误,这时就需要手工地,或者使用工具(如Nexus)对其进行修复。

3.3 镜像

  通俗来说就是某仓库的替代品。如下:

<settings>...<mirrors><mirror><id>maven.net.cn</id><name>one of the central mirrors in China</name><url>http://maven.net.cn/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors>...</settings>
  
  url元素就不必说了,仓库的地址。name就是为了方便我们理解,可以理解为注释,id是为了唯一标识一个仓库,重点是mirrorOf元素,上面的<mirrorOf>的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,我们也可以使用同样的方法配置其他仓库的镜像。

Maven高级的镜像配置:

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

注意:镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像藏库,因此而无法下载构件。

3.4 仓库搜索服务

  使用Maven进行日常开发的时候,一个常见的问题就是如何寻找需要的依赖,我们可能只知道需要使用类库的项目名称,但添加Maven依赖要求提供确切的Maven坐标。这时,就可以使用仓库搜索服务来根据关键字得到Maven坐标。

3.4.1 Sonatype Nexus

地址:https://repository.sonatype.org/

  Nexus是当前最流行的开源Maven仓库管理软件,这里介绍的是Sonatype假设一个公共Nexus仓库实例。Nexus提供了关键字搜索、类名搜索、坐标搜索、检验和搜索等功能。搜索后,页面清晰地列出了结果构件的坐标及所属仓库。我们可以直接下载相应构件,还可以直接复制已经根据坐标自动生成的XML依赖声明。

3.4.2 MVNrepository

地址:http://mvnrepository.com/ (推荐)

3.4.3 The Center Repository

地址:http://search.maven.org/#browse (推荐)

&#8195&#8195

参考资料:

《Maven实战》

最后修改时间:2017年3月29日16:30:33

********************************************************************************结束语********************************************************************************************
  我在写这篇博客的时候也是一名初学者,有任何疑问或问题请留言,或发邮件也可以,邮箱为:fanxiaobin.fxb@qq.com,我会尽早的进行更正及更改。
在我写过的博客中有两篇博客是对资源的整理,可能对大家都有帮助,大家有兴趣的话可以看看!!
下载资料整理——目录:http://blog.csdn.net/fanxiaobin577328725/article/details/51894331
  这篇博客里面是我关于我见到的感觉不错的好资源的整理,里面包含了书籍及源代码以及个人搜索的一些资源,如果有兴趣的可以看看,我会一直对其进行更新和添加。
优秀的文章&优秀的学习网站之收集手册:http://blog.csdn.net/fanxiaobin577328725/article/details/52753638
  这篇博客里面是我对于我读过的,并且感觉有意义的文章的收集整理,纯粹的个人爱好,大家感觉有兴趣的可以阅读一下,我也会时常的对其进行更新。
********************************************************************************感谢********************************************************************************************

0 0
原创粉丝点击