Maven仓库
Maven仓库
一、什么是Maven仓库
Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。
二、仓库的布局
任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一的存储路径,这便是Maven的仓库布局方式
考虑这个构件:groupId=org.testng、artifactId=testng、version=5.8、classifier=jdk5、packaging=jar,其对应的路径按如下步骤生成:
1.基于构件的groupId准备路径,formatAsDirectory(0将groupId中的句点分隔符转换成路径分隔符,org.testng -----> org/testng/
2.基于构件的artifactId准备路径,在前面的基础上加上artifactId分路径,org/testng/ ------> org/testng/testng/
3.使用版本信息,在前面的基础上加上veision和路径分隔符,org/testng/testng/ -----> org/testng/testng/5.8/
4.依次加上artifactId,构件分割连接符以及version,org/testng/testng/5.8/ -----> org/testng/testng/5.8/testng-5.8
5.如果构件有classifier,就加上构件分隔符连字号和classifier, org/testng/testng/5.8/testng-5.8 ------> org/testng/testng/5.8/testng-5.8-jdk5
6.检查构件的exclusion,若存在exclusion,则加上句点分割符和exclusion,packaging决定了构件的扩展名,最终路径为:org/testng/testng/5.8/testng-5.8-jdk5.jar
三、仓库的分类
仓库分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,本地仓库有则直接使用,若本地仓库没有或需要查看是否有更新的版本,
Maven就回去远程仓库查找,发现构件后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错
本地仓库:不管是Windows还是Linux,每个用户在自己的用户目录下都有一个路径为.m2/repository/的仓库目录
远程仓库:如果本地仓库相当于书房,那远成程库就相当于书店,书店可以有很多个。对于Maven来说,每个用户只有一个本地仓库,但可以配置很多远程仓库
中央仓库:由于最原始的本地仓库是空的,Maven必须知道至少有一个可用的远程仓库,中央仓库就是一个这样的默认的远程仓库,Maven的安装文件自带了中央仓库的配置
私服:私服是一种特殊的远程仓库,它是假设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用
私服的好处:
1.节省自己的外网带宽
2.加速Maven构建
3.部署第三方构建
4.提高稳定性,增强控制
5.降低中央仓库的负荷
四、仓库的配置
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 <updatePolicy>daily</updatePolicy> 12 <checksumPolicy>ignore</checksumPolicy> 13 </snapshots> 14 <layout>default</layout> 15 </repository> 16 </repositories>
repositories元素下,可以使用repository元素声明一个或多个远程仓库,id为远程仓库的唯一标识,name为仓库名称,url为仓库地址
releases为true,表示开启JBoss仓库的发布版本下载支持,snapshots为false,表示关闭JBoss仓库的快照版本的下载支持
layout元素值为default表示仓库的布局是maven2及maven3的默认布局,updatePolicy用来配置远程仓库的更新频率,默认值是daily,表示
每天检查一次,never,表示从不检查,always表示每次构建都检查,interval:X,表示每隔X分钟检查一次
checksumPolicy用来配置Maven检查检验和文件的策略,下载构件的时候,Maven会验证校验和文件,如果验证失败,当checksumPolicy的
值为warn时,Maven会输出警告信息,值为fail,遇到校验错误就让构建失败,ignore表示Maven完全忽略校验的错误
五、远程仓库的认证
有时候出于安全考虑,我们需要提供认证信息才能访问一些仓库
配置settings.xml
1 <servers> 2 <server> 3 <id>my-proj</id> 4 <username>repo-user</username> 5 <password>repo-pwd</password> 6 </server> 7 </servers>
这里的id需要跟pom中需要认证的repository元素的id完全一致
六、部署至远程仓库
Maven除了能对项目进行编译、测试、打包之外,还能将项目生成的构建部署到仓库中,编辑pom.xml
1 <distributionManagement> 2 <repository> 3 <id>proj-releases</id> 4 <name>Proj Release Repository</name> 5 <url>http://192.168.1.100/content/repositories/proj-releases</url> 6 </repository> 7 <snapshotRepository> 8 <id>proj-snapshots</id> 9 <name>Proj Snapshot Repository</name> 10 <url>http://192.168.1.100/content/repositories/proj-snapshots</url> 11 </snapshotRepository> 12 </destributionManagement>
distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本仓库,后者表示快照版本仓库
配置正确后,在命令行运行mvn clean deploy,Maven就会将项目构建输出的构件部署到配置的对应的远程仓库,如果项目当前的版本是快照版本,则
部署到快照版本仓库地址,否则就部署到发布版本仓库地址
七、镜像
如果仓库X可以提供仓库Y存储的所有的内容,那么就可以认为X是Y的一个镜像。可以使用镜像来代替中央仓库:编辑settings.xml:
1 <mirrors> 2 <mirror> 3 <id>maven.net.cn</id> 4 <name>one of the central mirrors in China</name> 5 <url>http://maven.net.cn/content/groups/public</url> 6 <mirrorOf>central</mirrorOf> 7 </mirror> 8 </mirrors>
mirrorOf值为central代表中央仓库,对于任何中央仓库的请求都会转至该镜像
为了满足一些复杂的需求,Maven还支持更高级的镜像配置:
<mirrorOf>*</mirrorOf> 匹配所有远程仓库
<mirrorOf>external:*</mirrorOf> 匹配所有不在本机上的远程仓库
<mirrorOf>repo1,repo2</mirrorOf> 匹配repo1,repo2仓库
<mirrorOf>*,!repo1</mirrorOf> 匹配所有远程仓库,repo1除外
八、仓库搜索服务
以下网站提供方便的途径寻找需要的依赖:
Sonatype:http://repository.sonatype.org/
Jarvana:http://www.jarvana.com/jarvana/
MVNbrowser: http://www.mvnbrowser.com/
MVNrepository:http://mvnrepository.com/