RoadMap
1. 仓库布局
任何一个构件(jar包) 都有一个唯一的GAV坐标,根据这个坐标,可以定位到它在仓库的存储路劲。
以 junit为例子
<groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version>
\junit\junit\4.12\junit-4.12.jar
如果有identifier,或者 extension 或在jar包名字后面加对应的名字
{artificat}-{version}-{identifier}.{packing}
2. 仓库分类
对于Maven来说,仓库有两种,本地仓库和远程仓库。
maven在构建的时候,会优先从本地仓库找,如果没有再去远程仓库找并且下载到本地仓库。
2.1 本地仓库
本地仓库 默认是在 ~/.m2/repository 下面, 也可以自定义。通过修改maven的配置文件 MAVEN_HONE/conf/Setting.xml
推荐在~/.m2/setting.xml 下做修改, 如果没有则拷贝MAVEN_HONE/conf/Setting.xml一份过来,因为conf/Setting.xml是全局的配置。
2.2 远程仓库
远程仓库是一个在线的MAVEN仓库,可以分为三类, 中央仓库,私服,其他类型
2.2.1 中央仓库
可以说是一个默认的 公共的远程仓库, 不管怎么说,maven至少有一个远程可用的仓库存在,以保证在构建的时候,本地仓库没有任何可用的jar时候可以访问远程库进行下载。
无需做任何配置的情况下, Maven默认将中央库配置http://repo1.maven.org/maven2 下面。
2.2.2 私服
私服是一个特殊的远程仓库,或者说是自行搭建的一个局域网内的在线仓库,如果是公网那就编程中央仓库了,
在有私服的情况下,在本地库不存在需要的jar 时候,会去私服上找,如果私服没有再去中央库下载。所以 私服它缓存了各大中央仓库的构建,另外私服也可以管理自行编写的构件。
针对有网略限制,或者有安全策略的(毕竟开源的jar并不是100%可靠的)社区或企业来说,搭建私服是一个很好的管理手段。
私服具有一下优势:
1. 节省外网带宽。 2.加速构建,毕竟是局域网内 3. 上传自定义构建 4.增强构建管理,5降低中央仓库的负荷
2.3 远程仓库的配置
仓库配置,可以在全局的配置文件或者项目pom文件里面 做配置.
配置节点是 <repositoires>和<pluginRepositories>
分别对应 构件库和插件库,虽然理论上都是jar,根据作用不同做了配置区分。
另外配置的时候可以指定下载 release还是snapshot
id,name,和url 可以任务是仓库的GAV坐标。
<repositories>
<repository>
<id>jboss</id>
<name>jboss</name>
<url>http://repostiory.jboss.com/maven2</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>daily</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>jboss</id>
<name>jboss</name>
<url>http://repostiory.jboss.com/maven2</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
<updatePolicy>daily</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
2.3.1 下载策略
下载策略指的是,何时去中央库缓存,同步,更新jar包。可以配置的值有
daily; 每天同步一次
never: 从来不同步
always:每次构建的时候 都去中央库同步一次
interval X: x表示每隔多少分钟同步跟新一次
2.3.2 文件检验策略
检验策略指的是,在同步或者上传构件的同时,会生成一份校验和文件,当maven客户端去下载构件的时候会进行校验,配置的策略做出不同的处理。
可配置的值有
warn: 发出警告,但依然会继续构建
ignore: 忽略校验信息
fail: 构建失败
2.4 远程认证
大部分远程仓库是不需要认证,直接可以访问。 出于安全考虑远程仓库提供了认证服务。
与仓库配置不同的是,它只能配置在 setting.xml里面
配置节点是<servers>,同时支持2种认证方式, 用户名密码和非对称密钥。
<servers>
<!-- server
| Specifies the authentication information to use when connecting to a particular server, identified by
| a unique name within the system (referred to by the 'id' attribute below).
|
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
| used together.
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
-->
<!-- Another sample, using keys to authenticate.
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
-->
</servers>
3 发布到远程仓库
mvn clean deploy 中的deploy阶段 并非把jar或者war 部署到应用服务器上,对于初学者来说非常容易混淆,这里的deploy是将构件 发不到远程仓库,至于发布到哪个远程仓库,需要早配置文件里面做配置,
配置节点是< distributionManagement>,id,name,url 是标识,可以通过id 在setting里面配置对应的认证策略。
可以配置 release repository 和snapshot repostiory
<distributionManagement>
<repository>
<id>ditritbution</id>
<name>repository name</name>
<url>url here</url>
</repository>
<snapshotRepository>
<id> snapshot distribtion id</id>
<name>repository name</name>
<url>url here</url>
</snapshotRepository>
</distributionManagement>
4 RELEASE版本与SNAPSHOT
5 仓库镜像
如果X仓库提供了Y仓库的所有内容,则X仓库是Y仓库的镜像,换句话说,从Y仓库获得的构建,也能从X仓库获得,由于网络原因或者防火墙的缘故,各区域或就进建一个镜像,定期同步源库的构建,就近原则,所以镜像的效率往往要高于源库。
镜像的配置在 setting.xml里面,配置节点是< mirrors>, 其中mirrorOf 表示一个中央仓库的ID,任何一个访问这个Id的请求都会路由到这个镜像。
其中 mirrorOf 支持通配
如
<mirrorOf>*</mirrotOf> 匹配所有远程仓库
<mirrorOf>repo1,repor2</mirrotOf>匹配repo1,repo2远程仓库
<mirrorOf>*,! repor2</mirrotOf>匹配所有远程仓库 repo2除外
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
</mirrors>
6 仓库搜索
在日常开发中,想要具体知道 构建的GAV,可以通过以下几个搜索网站进行查询
Sonatype Nexus:https://repository.sonatype.org/
MVNBrowser: http://www.mvnbrowser.com
Mvn Repository: http://mvnrepository.com