maven仓库分为本地仓库和远程仓库。远程仓库有中央仓库、私服、其他公共库。
本地仓库
默认情况下,不管是在windows还是linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。用户也可自定义本地仓库目录地址,编辑文件./m2/settings.xml,设置localRepository元素的值为想要的仓库地址。但需要注意,默认情况下,./m2/settings.xml文件是不存在的,需要到安装目录复制./conf/settings.xml文件再进行编辑。
中央仓库
原始的本地仓库是空的,maven必须知道至少一个可用的远程仓库,才能下载到需要的构件。中央仓库就是这样一个默认的远程仓库。maven的安装文件自带了中央仓库的配置。打开./lib/maven-model-builder-3.x..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>false</enabled>
</snapshots>
</repository>
</repositories>
此文件是所有maven项目都会继承的超级pom。
私服
即使在一台直接连入internet的个人机器上使用maven,也应该在本地建立私服。因为私服可以帮助你:
- 节省外网宽度
- 加速maven构建。maven的一些内部机制(如快照更新检查)要求maven在执行构建的时候不停的检查远程仓库数据。
- 部署第三方构件。
- 提高稳定性,增强控制。但internet不稳定时,maven就无法顺利构建。
远程仓库的配置
当默认的中央仓库无法满足需求时,可能需要的构件存在于另外一个远程仓库中,如JBoss Maven仓库。这时,可以在pom中配置该仓库。
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>https://repository.jboss.com/maven2</url>
<!-- default表示仓库的布局是maven2和maven3的默认布局,而不是maven1的布局 -->
<layout>default</layout>
<releases>
<!-- 开启JBoss仓库的发布版本下载支持 -->
<enabled>true</enabled>
</releases>
<snapshots>
<!-- enabled值为false,表示不从该仓库下载快照版本的构件 -->
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
对于releases和snapshots来说,处理enabled,还有两个子元素updatePolicy和checksumPolicy。
<snapshots>
<enabled>false</enabled>
<!-- 从远程仓库检查更新的频率,默认daily,表示每天检查一次。never-从不;always-每次构建;interval:X-每隔X分钟检查一次更新。 -->
<updatePolicy>daily</updatePolicy>
<!-- 检查检验和文件的策略。构件被部署到maven仓库时,会同时部署对应的校验和文件。下载时,就会验证校验和文件。此处配置检验失败的处理办法。warn-警告;fail-失败;ignore-忽略 -->
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
远程仓库的认证
出于安全考虑,我们需要提供认证信息才能访问一些远程仓库,这时就需要配置认证信息。认证信息必须配置在settings.xml文件中,因为pom会被提交到代码仓库供所有成员访问,而settings.xml一般只放在本机。更为安全。
<servers>
<server>
<!-- 此id必须与要认证的仓库id(pom中repository元素的id)完全一致 -->
<id>my-repository</id>
<username>username</username>
<password>password</password>
</server>
</servers>
部署到远程仓库
<distributionManagement>
<!--发布版本的构件仓库 -->
<repository>
<id>project-releases</id>
<name>project releases repository</name>
<url>http://192.168.40.240:8888/repository/maven-releases/</url>
<layout>default</layout>
</repository>
<!--快照版本的构件仓库,如果没有配置该元素,默认部署到repository元素配置的仓库 -->
<snapshotRepository>
<id>project-snapshots</id>
<name>project snapshots repository</name>
<url>http://192.168.40.240:8888/repository/maven-snapshots/</url>
<layout>legacy</layout>
</snapshotRepository>
</distributionManagement>
运行命令mvn deploy,maven就会项目构件输出到配置的远程仓库,如果项目当前的版本是快照版本,这部署到快照版本的仓库地址,否则就部署到发布版本的仓库地址。
快照版本
将项目构件发布到私服时,maven会自动为构件打上时间戳。比如模块A的版本为2.1-SNAPSHOT,发布后2.1-20191212.221414-13就表示2019-12-12 22:14:14的第13次快照。当构建依赖于A的模板B时,maven会自动从仓库中检查A的2.1-SNAPSHOT的最新构件,发现有更新时便进行下载。用户可以使用命令行-U参数强制让maven检查更新,如mvn install-U。
镜像
编辑settings.xml。
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- central表示为中央仓库的镜像 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
关于镜像的另一个常见用法是结合私服。私服可以代理任何外部的公共仓库。可以将配置集中到私服,从而简化maven本身的配置。这种情况下,可以将mirrorof配置为*,
- <mirrorOf>*</mirrorOf>:匹配所有的远程仓库
- <mirrorOf>external:*</mirrorOf>:匹配所有不在本机上的远程仓库
- <mirrorOf>repo1,repo2</mirrorOf>:匹配仓库repo1和repo2。
- <mirrorOf>*,!repo1</mirrorOf>:匹配所有远程仓库,rpo1除外。