一、概述
由于maven坐标机制,任何maven项目使用任何一个构件的方式都是完全相同的,在此基础上,maven可以在某个位置统一存储所有maven项目共享的构件,这个统一位置就是仓库。
二、仓库的布局
假设groupId=org.tv、artifactId=test、version=1.0、classifier=jdk15、packaging=jar,其对应的路径应该为org/tv/test/1.0/test-1.0-jdk15.jar
三、仓库的分类
1、对于maven来说仓库分为两类:本地仓库和远程仓库。当maven根据坐标寻找的时候先查看本地仓库,如果本地仓库存在此构件就可以直接使用;如果本地仓库不存在此构件或者需要查看是否有更新的构件版本,maven就会去远程仓库查找,发现需要的构件后下载到本地仓库再使用。如果本地和远程都没有,就会报错。
2、中央仓库是maven核心自带的远程仓库,它包含了绝大部分开源的构件,在默认配置下,当本地仓库没有maven需要的构件时,它会尝试从中央仓库下载。
3、私服是另外一种远程仓库,在局域网络内架设一个私有的仓库服务器,用 其代理所有的外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
4、不管是在windows还是在linux上,每个用户在自己的用户目录下都有一个路径名称为.m2/repository/的仓库目录。linux中该文件默认是隐藏的,可以使用ls -a命令显示隐藏文件或者目录。
用户可自定义本地仓库目录的地址,可以编辑~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址:
<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>
默认情况下,~/.m2/settings.xml文件是不存在的,需要从maven安装目录复制$M2_HOME/conf/settings.xml文件再进行编辑。
四、远程仓库的配置
1、修改远程仓库
下载的settings.xml中都包含有一个默认的中央仓库地址,如果默认的中央仓库无法满足项目的需求。可以在POM中配置该仓库,例如JBoss Maven仓库:
<project>
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
</project>
其中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,snapshots的enabled为false,表示关闭仓库的快照版本下载支持。updatePolicy来配置更新频率,never-从不,always-每次构件都检查,interval:X-每个X分钟检查一次。元素checksumPolicy用来配置maven检查检验和文件的策略,默认warn-输出警告信息,fail-让构建失败,ignore-完全忽略校验和错误。
2、远程仓库认证
认证信息必须配置在settings.xml中:
<settings>
<servers>
<id>my-proj</id>
<username>user</username>
<password>pwd</password>
</servers>
</settings>
3、部署至远程仓库
maven能将项目生成的构件部署到远程仓库中,编辑项目的pom.xml文件如下:
<project>
<distributionManagement>
<repository>
<id>proj-releases</id>
<name>Proj</name>
<url>http://192.168.1.100/content/repositories/proj-releases</url>
</repository>
<snapshotRepository>
<id>proj-snapshot</id>
<name>Proj snapshot</name>
<url>http://192.168.1.100/content/repositories/proj-snapshot</url>
</snapshotRepository>
</distributionManagement>
</project>
repository表示的是发布构件的仓库,snapshotRepository表示发布快照的仓库地址。id为远程仓库的唯一标识,name是为了方便阅读。
五、快照版本
快照版本存在不稳定性,例如maven-SNAPSHOT-2.0.jar快照版本值应该在公司内部的项目或者模块间依赖使用。以为这个时候,公司对于这些快照版本的依赖具有完全的理解和控制权。项目不应该依赖与任何公司外部的快照版本,由于快照版本不稳定的原因,这样的依赖会存在不稳定性。