2.1 Maven坐标
Maven坐标是Maven用来表示一个组件依赖的标示。
Maven
通过下面几个元素定义坐标:groupId、artifactId、version、packaging、classifier
.
groupId
:定义当前Maven
项目隶属的实际项目。不应该是组织或公司(一个公司有很多项目,每个项目有很多模块)。
artifactId
:定义实际项目的一个Maven
模块,推荐使用实际项目名称作为前缀。
version
:定义Maven
项目当前所处的版本。
packaging
:定义Maven
项目的打包方式,可选的有:jar
(默认)、war
、pom
,不同的打包方式会影响构建的生命周期。
classifier
:定义构建输出的一些附属构建,如javadoc
、sources
。
2.2 Maven仓库
Maven
坐标是一个构件的逻辑表示,构件的物理表示是文件,Maven
通过仓库来统一管理这些文件。
得益于坐标机制,Maven
项目能够以统一的方式来使用任何构件,在此基础上,Maven
可以在某个位置统一存储所有Maven
项目共享的构建,这个统一位置就是仓库。
2.2.1 仓库的分类
Maven
中的仓库分为:本地仓库和远程仓库。
Maven根据坐标寻找构件时,先查看本地仓库是否存在该构件,存在则直接使用;否则就查找远程仓库,找到之后就下载到本地仓库;本地和远程都没找到,直接报错。
中央仓库是Maven
核心自带的远程仓库,含绝大多数开源的构件;
私服是在局域网搭建的仓库服务器,用于代理外部的远程仓库,可以节省带宽和时间,内部的项目还能部署到私服供其他项目使用;使用私服可以加速Maven构建以及提高稳定性,内网访问不需要依赖于网络。
其他公共服,如阿里云等。
本地仓库:配置路径${M2_HOME}/conf/settings.xml
,默认是${user.home}/.m2/repository
.
构件进入本地仓库有两种方式:Maven
从远程仓库下载到本地仓库;通过在项目执行mvn install
安装到本地。
对Maven
而言,用户的本地仓库只有一个,但可以配置访问很多远程仓库。而中央仓库是默认的远程仓库,在$M2_HOME/lib/maven-model-builder-{version}.jar
的org/apache/maven/model/pom-4.0.0.xml
文件定义了,该POM
也被称为超级POM
。
2.2.2 仓库的布局
构件在Maven仓库里的存储路径为:{groupId}/{artifactId}/{version}/{artifactId-version.packaging}
2.2.3 远程仓库的配置
通过POM
文件的<repositories><repository>
元素可以配置远程仓库,如:
<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>
相比于发布版本,快照版本还有下面两个属性:
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
daily
,可选择有never
、always
、interval:X
(X分钟检查一次)。
Maven
检查校验和的策略,默认值是warn
(校验不通过时警告),可选择还有fail
(校验不通过时构建失败)、ignore
(忽略校验错误)
2.3 镜像
如果仓库X可以提供仓库Y存储的所有内容,则认为X是Y的一个镜像。关于镜像的配置可以在${M2_HOME}/conf/settings.xml
中进行配置:
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
Remark:由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务时,Maven仍将无法访问被镜像仓库,因而将无法下载构件。