MAVEN版本:
3.6.1
参考: http://www.voidcn.com/article/p-kufgcswl-mv.html
balabala…
本地仓库 VS 远程仓库
运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库
获取的。
如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
本地仓库
${user.home}/.m2/repository
。也就是说,一个用户会对应的拥有一个本地仓库。${user.home}/.m2/settings.xml
中如下内容:<settings>
<localRepository>E:\maven\repositorylocalRepository>
settings>
mvn clean install -Dmaven.repo.local=YOUR_LOCAL_REPO
远程仓库
了解了本地仓库,接着了解一下Maven缺省的远程仓库,即Maven中央仓库。
这个Maven中央仓库是在哪里定义的呢?
${M2_HOME}/lib/maven-model-builder-3.6.1.jar
,打开该文件,能找到超级POM:/org/apache/maven/model/pom-4.0.0.xml
,定义来默认对中央仓库:central
.
私服
通常,公司内部会搭建一个内部对maven仓库(私服
),我们通常通过私服来获取构件,结构如下图:
Nexus
是比较常用的Maven私用服务器。
图片引用自: https://blog.csdn.net/liujiahan629629/article/details/39272321
在pom中配置远程仓库
<project>
<repositories>
<repository>
<id>aliyunid>
<name>aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<releases><enabled>trueenabled>releases>
<snapshots><enabled>trueenabled>snapshots>
repository>
<repository>
<id>huaweiid>
<name>华为云name>
<url>https://repo.huaweicloud.com/repository/maven/url>
<releases><enabled>trueenabled>releases>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyunid>
pluginRepository>
pluginRepositories>
project>
setting.xml中配置远程仓库
我们知道了如何在POM中配置远程仓库,还可以在setting.xml
中配置仓库。
但是
并不支持
, 我们需要利用
来配合使用,最终通过
来激活指定的
.
<settings>
<profiles>
<profile>
<id>devid>
<repositories>
<repository>
repository>
repositories>
profile>
<profile>
<id>testid>
<repositories>
<repository>
repository>
repositories>
profile>
<profile>
<id>prodid>
<repositories>
<repository>
repository>
repositories>
profile>
profiles>
<activeProfiles>
<activeProfile>devactiveProfile>
<activeProfile>testactiveProfile>
activeProfiles>
settings>
首先申明一个前提:
本地仓库
的优先级最高,接下来我们在以实际上不存的构件为前提下进行测试。
前文了解到,可以在多个地方,每个地方又可以配置多个仓库,那么仓库加载的优先级是如何的呢?
下面我们来综合分析下,假设我们引用一个不存在的构件:
<dependencies>
<dependency>
<groupId>org.junitgroupId>
<artifactId>junitartifactId>
<version>x.y.zversion>
dependency>
dependencies>
仅在pom中配置多个repository
<repositories>
<repository>
<id>huaweiid>
<name>华为云name>
<url>https://repo.huaweicloud.com/repository/maven/url>
<releases><enabled>trueenabled>releases>
repository>
<repository>
<id>aliyunid>
<name>阿里云name>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<releases><enabled>trueenabled>releases>
<snapshots><enabled>falseenabled>snapshots>
repository>
repositories>
执行命令:mvn clean install -U
来强制更新,结果如下:
通过执行结果,可以推测出:在
中定义的顺序先后进行加载,最后再尝试加载中央仓库。
同事在setting.xml中配置多个仓库
在前文的基础上,在setting.xml
中配置多个profile
,且同时激活多个profile
,配置如下:
<settings>
<profiles>
<profile>
<id>devid>
<repositories>
<repository><id>dev2id> repository>
<repository><id>dev1id>repository>
repositories>
profile>
<profile>
<id>testid>
<repositories>
<repository> <id>test1id> repository>
<repository> <id>test2id> repository>
repositories>
profile>
<profile>
<id>prodid>
<repositories>
<repository> <id>prod1id> repository>
<repository> <id>prod2id> repository>
repositories>
profile>
profiles>
<activeProfiles>
<activeProfile>testactiveProfile>
<activeProfile>devactiveProfile>
activeProfiles>
settings>
执行命令:mvn clean install -U
来强制更新,结果如下:
可以得出结论:
settings.xml
中
激活
,且
会按照定义的先后顺序加载
内部的
中的多个仓库,同样按照定义的先后顺序加载pom.xml
中的仓库(按顺序加载)通常,有很多依赖(构件)在中央仓库(境外
),由于众所周知的原因会下载的很慢,或者压根下载不到,我们可以通过代理(镜像)
来实现.
通过镜像的配置mirrorOf
,覆盖指定仓库的url
,从而实现代理
的功能。
mirror并不会影响仓库的加载顺序,而是在确定了仓库之后,改变仓库的请求地址!
配置多个mirror以及镜像的优先级
注意,镜像只能在
settings.xml
中配置
在前文的基础上,增加mirror
配置, 同时为central中央仓库
添加 三个镜像:
<settings>
<mirrors>
<mirror>
<id>mirror2id>
<mirrorOf>centralmirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
mirror>
<mirror>
<id>mirror1id>
<mirrorOf>centralmirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
mirror>
<mirror>
<id>mirror3id>
<mirrorOf>centralmirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
mirror>
mirrors>
settings>
执行mvn clean install -U
,强制更新:
从结果可以得出结论:如果一个仓库匹配到多个mirror,会按照先后顺序进行匹配
,仅第一个匹配到的mirror有效.
mirrorOf -配符
通过镜像的配置mirrorOf
,覆盖指定仓库的url
,mirrorOf 中除了指定具体的repository配置对id
,maven还支持更高级的用法:
*
: 所有远程仓库都从该镜像获取*,!repo1
: 除repo1
远程仓库以外的所有仓库都从该镜像获取repo1,repo2
: repo1
和 repo2
仓库都从该镜像获取external:*
:不在本地仓库的文件才从该镜像获取mvn install
会将项目生成的构件安装到本地Maven仓库,mvn deploy
用来将项目生成的构件分发到远程Maven仓库
。本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库(通常是私服)之后,你的同事才能使用到你发布的构建。
pom中配置-distributionManagement
<distributionManagement>
<snapshotRepository>
<id>nexus-snapshotid>
<url>http://your_company_nexus_host:port/repository/maven-snapshots/url>
snapshotRepository>
<repository>
<id>nexus-releaseid>
<url>http://your_company_nexus_host:port/repository/maven-releasesurl>
repository>
distributionManagement>
Maven区别对待release
版本的构件和snapshot
版本的构件,
- snapshot
为开发过程中的版本,实时,但不稳定,会部署到
仓库。
- release
版本则比较稳定,会部署到
仓库。
Maven会根据你项目的版本号
来判断将构件分发到哪个仓库。
*-SNAPSHOT
形式时,会部署到
,注意**-SNAPSHOT(大小写不敏感,但是 - 必须要有)**
setting.xml配置servers
一般来说,分发构件到远程仓库需要认证,如果你没有配置任何认证信息,你往往会得到401错误。
<servers>
<server>
<id>nexus-snapshotid>
<username>deploymentusername>
<password>deployment123password>
server>
<server>
<id>nexus-releaseid>
<username>publishusername>
<password>publish123password>
server>
servers>
最后使用mvn deploy
部署即可。