仓库
Maven 中, 任何一个依赖、插件或项目构建的输出, 都可称为构件, 而Maven仓库就是集中存储这些构件的地方。
Maven仓库可简单分成两类: 本地仓库与远程仓库. 当Maven根据坐标寻找构件时, 它会首先检索本地仓库, 如果本地存在则直接使用, 否则去远程仓库下载。如果本地仓库和远程仓库都没有需要的构建Maven就会报错。
本地仓库
默认地址为用户目录下/.m2/repository/的仓库路径,如果需要自定义仓库地址,则要修改/.m2/settings.xml设置localRepository元素值为仓库地址。settings.xml可以从maven的安装目录下conf文件拷贝。
<localRepository>E:\maven\repository</localRepository>
中央仓库
Maven默认的远程仓库,安装文件中自带了中央仓库的配置,Maven安装目录下lib/maven-model-builder-3.2.5.jar中,解压缩找到org\apache\maven\model\pom-4.0.0.xml,可以看到如下默认远程仓库配置:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
远程仓库配置
pom.xml中配置
在平时的开发中,我们往往不会使用默认的中央仓库,默认的中央仓库访问的速度比较慢,访问的人或许很多,有时候也无法满足我们项目的需求。这时,可以在pom.xml中配置该仓库,
<!-- 配置远程仓库 -->
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
- releases和snapshots:用来控制Maven对于发布版构件和快照版构件的下载权限。需要注意的是enabled子元素,该例中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。updatePolicy用来配置Maven从远处仓库检查更新的频率,可用的值包括:daily(默认)-每天检查一次;never-从不检查更新;always-每次构建都检查更新;interval:X-每隔X分钟检查一次更新(X为任意整数)。checksumPolicy用来配置Maven检查校验和文件的策略。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,配置checksumPolicy为warn(默认)-Maven会在执行构建时输出警告信息;fail-Maven遇到校验和错误就让构建失败;ignore-使Maven完全忽略校验和错误。
- layout:元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。基本不会用到Maven1的布局。
Settings.xml中配置
如果很多项目都需要配置相同的远程从仓库,那么再每个项目的pom.xml中配置会带来很多重复操作,可以在settings.xml中统一配置该远程仓库。可以在profile中通过repositories配置多个repository,并在activeProfiles中将该profile激活。
<profiles>
<profile>
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>central</id>
<name>repo</name>
<url>...</url>
</repository>
</repositories>
<id>artifactory</id>
</profile>
</profiles>
<activeProfiles>
<activeProfile>artifactory</activeProfile>
</activeProfiles>
maven自动下载依赖时,会涉级读取三个配置文件,分别是项目下的pom.xml 文件 、home目录下的.m2/settings.xml 与 maven 全局配置settings.xml,三者的级先是 pom.xml > /home_dir/.m2/settings.xml > /maven_dir/conf/settings.xml ,也就是说maven会先去项目pom.xml中配置的仓库中下载构建,下载不到再去home目录下的.m2/settings.xml下配置的仓库载构建,还是找不到最后去全局配置settings.xml下配置的仓库下载。
远程仓库认证
Settings.xml配置
大部分公共的远程仓库无须认证就可以直接访问,但我们在平时的开发中往往会架设自己的Maven远程仓库,出于安全方面的考虑,我们需要提供认证信息才能访问这样的远程仓库。配置认证信息和配置远程仓库不同,远程仓库可以直接在pom.xml中配置,但是认证信息必须配置在settings.xml文件中。Settings.xml中配置如下信息:
<settings>
...
<!--配置远程仓库认证信息-->
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
...
</settings>
上面代码我们配置了一个id为releases的远程仓库认证信息。Maven使用settings.xml文件中的servers元素及其子元素server配置仓库认证信息。settings.xml中server元素的id必须与pom.xml中需要认证的repository元素的id完全一致。
pom.xml中配置
Maven除了能对项目进行编译、测试、打包之外,还能将项目生成的构件部署到远程仓库中。需要在项目pom.xml中配置distributionManagement元素:
<distributionManagement>
<repository>
<id>releases</id>
<name>public</name>
<url>...</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>...</url>
</snapshotRepository>
</distributionManagement>
镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。举个例子,http://maven.oschina.net/content/groups/public/ 是中央仓库http://repo1.maven.org/maven2/ 在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。因此,可以配置Maven使用该镜像来替代中央仓库。配置settings.xml:
<mirrors>
<mirror>
<id>maven.oschina.net</id>
<name>maven mirror in China</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
其中mirrorOf表示该镜像代替的仓库范围:
<mirrorOf>central</mirrorOf>
中央仓库的镜像,所有对中央仓库的请求都会转至该镜像。<mirrorOf>*</mirrorOf>
匹配所有远程仓库<mirrorOf>extenal:*</mirrorOf>
匹配所有不在本机上的远程仓库(匹配所有远程仓库,localhost、file://协议除外)<mirrorOf>repo1,repo2</mirrorOf>
匹配仓库repo1和repo2<mirrorOf>*,!repo1</mirrorOf>
匹配所有非repo1的远程仓库
参考:《Maven实战》