[关闭]
@7788999z 2014-05-30T06:47:32.000000Z 字数 4974 阅读 1051

第6章 仓库

Maven实战


坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式;而构件的物理表示方式为文件,Maven通过仓库来统一管理这些文件。

6.1 何为Maven仓库

存储所有Maven项目共享的构件的位置。

6.2 仓库的布局

任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库的唯一存储路径,这便是仓库的布局方式。
例如:考虑这样一个构件,groupId=org.testng、artifactId=testng、version=5.8、classifier=jdk15、packaging=jar,其对应的构件路径按照如下步骤生成:

  • groupId: org.testng ==> org/testng/
  • artifactId: testng ==> testng/
  • version(baseVersion[1]): 5.8 ==> 5.8/
  • artifactId-version(version) ==> testng-5.8
  • [-classifier] ==> -jdk5
  • [.packaging] ==> .jar
  • 构件路径:org/testng/testng/5.8/testng-5.8-jdk5.jar。

6.3 仓库的分类

仓库只分为两类:本地仓库和远程仓库。
其中远程仓库又有分类,如下图:
远程仓库分类

6.3.1 本地仓库
默认本地仓库地址:

  • Windows:C:\Users\用户名\.m2\repository\
  • Linux:/home/用户名/.m2/repository/

自定义本地仓库的目录地址,可编辑文件~/.m2/settings.xml(此文件默认是不存在的,需要复制M2_HOME/conf/settings.xml文件进行修改),设置localRepository元素的值为想要的本地仓库地址:

  1. <settings>
  2. <localRepository>D:\java\repository\</localRepository>
  3. </settings>
使用mvn clean install指令将本地项目的构件安装到Maven本地仓库中。

6.3.2 远程仓库

6.3.3 中央仓库
一个默认的远程仓库,大部分构件都可以从中央仓库获取到。
超级POM:所有Maven项目都会继承它。

  • 使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-xxx.jar(在Maven2中,jar文件路径类似于$M2_HOME/lib/maven-2.2.1-uber.jar);
  • 然后访问路径org/apache/maven/model/pom-4.0.0.xml。

6.3.4 私服
一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。
私服的用途
私服的优点:

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

6.4 远程仓库的配置

配置JBoss Maven仓库:

  1. <repositories>
  2. <repository>
  3. <id>jboss</id>
  4. <name>JBoss Repository</name>
  5. <url>http://repository.jboss.com/maven2</url>
  6. <releases>
  7. <enabled>true</enabled>
  8. </releases>
  9. <snapshots>
  10. <enabled>false</enabled>
  11. </snapshots>
  12. <layout>default</layout>
  13. </repository>
  14. </repositories>

配置说明:

  • id:必须唯一。Maven自带的中央仓库的id为central,如果其他仓库的id也声明为central,就会覆盖中央仓库的配置。
  • url:指向仓库的地址。一般都是基于http协议。
  • releases:enable为true,表示开启JBoss仓库的发布版本的下载支持。
  • snapshots:enable为false,表示关闭JBoss仓库的快照版本的下载支持。
  • layout:default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。

updatePolicy和checksumPolicy:

  1. <snapshots>
  2. <enabled>false</enabled>
  3. <updatePolicy>daily</updatePolicy>
  4. <checksumPolicy>warn</checksumPolicy>
  5. </snapshots>
  • updatePolicy:配置Maven从远程仓库更新的频率,默认值为daily,每天检查一次。其他可用值包括:never——从不检查更新;always——每次构建都检查更新;interval:X——每隔X分钟检查一次更新。
  • checksumPolicy:配置Maven检查校验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件的时候,Maven会验证校验和文件,如果验证失败怎么办?当checksumPolicy的值为默认值warn时,Maven会在执行构建输出警告信息,其他可用值包括:fail——Maven,让构建失败;ignore:忽略校验和错误。

6.4.1 远程仓库的认证
访问需要用户名和密码进行认证的远程仓库时,需要在本机的settings.xml中进行用户信息配置。

  1. <servers>
  2. <server>
  3. <id>nexus-releases</id>
  4. <username>admin</username>
  5. <password>admin123</password>
  6. </server>
  7. <server>
  8. <id>nexus-snapshots</id>
  9. <username>admin</username>
  10. <password>admin123</password>
  11. </server>
  12. </servers>
  • id:必须与POM中需要认证的repository元素的id完全一致。

6.4.2 部署构件至远程仓库

  1. <distributionManagement>
  2. <repository>
  3. <id>nexus-releases</id>
  4. <name>Nexus Release Repository</name>
  5. <url>http://172.16.0.88:8081/nexus/content/groups/public</url>
  6. </repository>
  7. <snapshotRepository>
  8. <id>nexus-snapshots</id>
  9. <name>Nexus Snapshot Repository</name>
  10. <url>http://172.16.0.88:8081/nexus/content/repositories/snapshots/</url>
  11. </snapshotRepository>
  12. </distributionManagement>

配置正确后,使用mvn clean deploy命令,Maven就会将项目构建输出的构件部署到配置对应的远程仓库。

6.5 快照版本

便于开发者进行开发。例如:某一个Maven项目是2.1-SNAPSHOT版本,发布到私服中时,Maven会自动为项目打上时间戳,比如会有2.1-20140430.102914-13这样的一个快照版本,表示2014年4月30号10点29分14秒的第13次快照。

模块B依赖于模块A的快照版本,默认情况下,在构建A的时候,Maven每天会检查一次更新(由仓库的updatePolicy控制),也可以使用mvn clean install-U强制更新。

6.6 从仓库解析依赖的机制

依赖解析机制:

1) 当依赖的范围是system的时候,Maven直接从本地文件系统解析构件。
2) 根据坐标计算出构件存储路径后,先从本地仓库寻找构件,找到即解析完成。
3) 本地仓库中没有时,如果依赖的是正式发布版本的构件,则遍历所有的远程仓库,找到即解析完成。
4) 如果依赖的版本是RELEASE或LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST真实的值,然后基于这个真实的值检查本地和远程仓库,如步骤2)、3)。
5) 如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新的快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。
6) 如果最后解析得到的构件版本是时间戳格式的快照,如2.1-20140430.102914-13,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用其非时间戳格式的构件。

注意:Maven3中已经不支持在插件配置中使用RELEASE或LATEST。

6.7 镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为仓库X是仓库Y的一个镜像。
例如:http://maven.net.cn/content/groups/public/是中央仓库http://repo1.maven.org/maven2/在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。

在settings.xml中配置镜像:

  1. <mirrors>
  2. <mirror>
  3. <id>nexus</id>
  4. <name>nexus</name>
  5. <url>http://172.16.0.88:8081/nexus/content/groups/public</url>
  6. <mirrorOf>*</mirrorOf>
  7. </mirror>
  8. <mirror>
  9. <id>nexus</id>
  10. <name>nexus</name>
  11. <url>http://172.16.0.88:8081/nexus/content/groups/public</url>
  12. <mirrorOf>*</mirrorOf>
  13. </mirror>
  14. <mirror>
  15. <id>maven.net.cn</id>
  16. <name>one of the central mirrors in China</name>
  17. <url>http://maven.net.cn/content/groups/public/</url>
  18. <mirrorOf>central</mirrorOf>
  19. </mirror>
  20. </mirrors>
配置解析:
1) mirrorOf:表示镜像的原仓库。值为central,表示当前为Maven中央仓库的central的镜像。任何对于中央仓库的请求都会转至该镜像。
2) 值为*:匹配所有远程仓库。
3) 值为external::匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
4) 值为repo1,repo2:匹配仓库repo1和repo2,使用“,”分隔多个远程仓库。
5) 值为
,! repo1:匹配所有远程仓库,repo1除外。

6.8 仓库搜索服务


使用仓库搜索服务根据关键字得到Maven的坐标。
通过类库的项目名称搜寻项目的坐标信息。

6.8.1 Sonatype Nexus
地址:http://repository.sonatype.org/

6.8.2 Jarvana
地址:http://www.jarvana.com/jarvana/
Jarvana提供了基于关键字、类名的搜索、构件下载、依赖声明片段也一应俱全。

6.8.3 MVNbrowser
地址:http://www.mvnbrowser.com

6.8.4 MVNrepository
地址:http://mvnrepository.com



[1] 主要为SNAPSHOT版本服务,如version为1.0-SNAPSHOT的构件,其baseVersion为1.0。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注