@7788999z
2014-05-30T06:47:32.000000Z
字数 4974
阅读 1051
Maven实战
存储所有Maven项目共享的构件的位置。
任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库的唯一存储路径,这便是仓库的布局方式。
例如:考虑这样一个构件,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.1 本地仓库
默认本地仓库地址:
- Windows:C:\Users\用户名\.m2\repository\
- Linux:/home/用户名/.m2/repository/
自定义本地仓库的目录地址,可编辑文件~/.m2/settings.xml(此文件默认是不存在的,需要复制M2_HOME/conf/settings.xml文件进行修改),设置localRepository元素的值为想要的本地仓库地址:
<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>
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的构建。
- 部署第三方的构件(无法从外部仓库获取到的构件)。
- 提高稳定性,增强控制。
- 降低中央仓库的负荷。
配置JBoss Maven仓库:
<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>
配置说明:
- id:必须唯一。Maven自带的中央仓库的id为central,如果其他仓库的id也声明为central,就会覆盖中央仓库的配置。
- url:指向仓库的地址。一般都是基于http协议。
- releases:enable为true,表示开启JBoss仓库的发布版本的下载支持。
- snapshots:enable为false,表示关闭JBoss仓库的快照版本的下载支持。
- layout:default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。
updatePolicy和checksumPolicy:
<snapshots>
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
- updatePolicy:配置Maven从远程仓库更新的频率,默认值为daily,每天检查一次。其他可用值包括:never——从不检查更新;always——每次构建都检查更新;interval:X——每隔X分钟检查一次更新。
- checksumPolicy:配置Maven检查校验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件的时候,Maven会验证校验和文件,如果验证失败怎么办?当checksumPolicy的值为默认值warn时,Maven会在执行构建输出警告信息,其他可用值包括:fail——Maven,让构建失败;ignore:忽略校验和错误。
6.4.1 远程仓库的认证
访问需要用户名和密码进行认证的远程仓库时,需要在本机的settings.xml中进行用户信息配置。
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
- id:必须与POM中需要认证的repository元素的id完全一致。
6.4.2 部署构件至远程仓库
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://172.16.0.88:8081/nexus/content/groups/public</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://172.16.0.88:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
配置正确后,使用mvn clean deploy命令,Maven就会将项目构建输出的构件部署到配置对应的远程仓库。
便于开发者进行开发。例如:某一个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强制更新。
依赖解析机制:
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。
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为仓库X是仓库Y的一个镜像。
例如:http://maven.net.cn/content/groups/public/是中央仓库http://repo1.maven.org/maven2/在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。
在settings.xml中配置镜像:
<mirrors>
<mirror>
<id>nexus</id>
<name>nexus</name>
<url>http://172.16.0.88:8081/nexus/content/groups/public</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>nexus</id>
<name>nexus</name>
<url>http://172.16.0.88:8081/nexus/content/groups/public</url>
<mirrorOf>*</mirrorOf>
</mirror>
<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>
1) mirrorOf:表示镜像的原仓库。值为central,表示当前为Maven中央仓库的central的镜像。任何对于中央仓库的请求都会转至该镜像。
2) 值为*:匹配所有远程仓库。
3) 值为external::匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
4) 值为repo1,repo2:匹配仓库repo1和repo2,使用“,”分隔多个远程仓库。
5) 值为,! repo1:匹配所有远程仓库,repo1除外。
6.8.1 Sonatype Nexus
地址:http://repository.sonatype.org/
6.8.2 Jarvana
地址:http://www.jarvana.com/jarvana/
Jarvana提供了基于关键字、类名的搜索、构件下载、依赖声明片段也一应俱全。
6.8.4 MVNrepository
地址:http://mvnrepository.com