前言
本篇主要介绍Maven仓库的分类和仓库使用的一些配置
一、仓库分类
对Maven来说,仓库只分两种:本地仓库和远程仓库。远程仓库又包括中央仓库、私服等其他仓库。
1.本地仓库
本地仓库,在settings.xml
中配置
<localRepository>D:/repository</localRepository>
当Maven根据坐标寻找构件的时候,它首先会查看本地仓库。如果本地仓库存在此构建,则直接使用。如果本地仓库不存在此构件或者需要查看是否有更新的构建版本,Maven就会去远程仓库查找,发现构建之后下载到本地使用。
2.远程仓库
中央仓库是Maven核心自带的远程仓库,包含了绝大部分的开源组件。是默认的远程仓库。Maven的安装文件自带了中央仓库的配置。
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库,内部的项目还能部署到私服上供其他项目使用。
当Maven需要下载构建的时候,它从私服请求,如果私服上不存在该构建,则从外部的远程仓库下载,缓存私服后再为Maven的下载请求提供服务。一些无法从外部仓库下载到的构建也能从本地上传到私服上供大家使用。
二、远程仓库配置
1.配置多个仓库
有些时候,可能项目中需要的构建存在于另外一个远程仓库中,这时可以在pom.xml
中进行配置
<repositories>
<repository>
<id>jboss-maven2-release-repository</id>
<name>JBoss</name>
<url>http://repository.jboss.org/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
任何一个仓库声明的id必须是唯一的,尤其需要注意的是,Maven自带的中央仓库使用的id是central。如果其他仓库声明也是用该id,就会覆盖中央仓库的配置。
release
的enabled
值为true
,表示开启JBoss仓库版本的发布下载支持。snapshots
的enabled
值为false
,表示关闭JBoss仓库版本的下载支持。
updatePolicy
表示更新的频率
也可以在settings.xml
文件中配置,以下为项目中用到的配置方式(xxx表示实际的私服地址)
<profiles>
<profile>
<id>rdc</id>
<properties>
<altReleaseDeploymentRepository>
rdc-releases::default::xxx
</altReleaseDeploymentRepository>
<altSnapshotDeploymentRepository>
rdc-snapshots::default::xxx
</altSnapshotDeploymentRepository>
</properties>
<repositories>
<repository>
<id>central</id>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>rdc-releases</id>
<url>xxx</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>rdc-snapshots</id>
<url>xxx</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>rdc</activeProfile>
</activeProfiles>
有些仓库需要进行认证,可在settings.xml
文件中进行配置(xxx表示实际的用户名和密码)。其中关键配置id选,必须要和repository
元素的id保持一致
<servers>
<server>
<id>rdc-releases</id>
<username>xxx</username>
<password>xxx</password>
</server>
<server>
<id>rdc-snapshots</id>
<username>xxx</username>
<password>xxx</password>
</server>
</servers>
2.部署到远程仓库
私服的一大作用是部署第三方构件,包括内部生成的构件。
可以在pom.xml中进行配置
<project>
...
<distributionManagement>
<repository>
<id>rdc-releases</id>
<url>xxx</url>
</repository>
<snapshotRepository>
<id>rdc-snapshots</id>
<url>xxx</url>
</snapshotRepository>
</distributionManagement>
...
</project>
distributionManagement
包含repository
和snapshotRepository
,前者表示发布版本构件的仓库,后者表示快照版本的仓库。这两个元素下都需要配置id和url。
id是唯一标识,在部署的时候往往需要进行认证,这是id的值要和settings.xml
的认证配置要保持一致。
配置完成后,可以通过命令mvn clean deploy
将构件部署到对应的远程仓库。如果当前项目时快照版本则发布到快照对应的地址。
3.快照版本
对于依赖的构件,有时候会看到版本是1.0-SNAPSHOT
或者是1.0
,带有SNAPSHOT
是快照版本,表示还没正式发布,该版本将来会进行更改。出现快照版本的一个只要原因是,主要是用来解决模块之间互相依赖和协同开发问题。
构件的1.0-SNAPSHOT
快照版本发布到私服,在发布的过程中,Maven会自动为构建打上时间戳。有了时间戳,Maven就能随时找到该构件1.0-SNAPSHOT
最新的文件。那么其他依赖了此构建版本的服务,就可以获取到最新的文件而不用频繁去修改pom.xml
文件。
当项目经过完善的测试后需要发布的时候,就应该将快照版本更改为发布版本,例如将1.0-SNAPSHOT
更改为1.0
,表示该版本已经稳定了,且只对应了唯一的构件。
下面记录一次本地快照版本没有更新的解决方法(需要配置idea)
三、镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public/</url>
</mirror>
</mirrors>
<mirrorOf>
的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像。如果该镜像需要认证,也可以基于该id配置仓库的认证。
关于镜像的一个更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库(包括中央仓库),因此组织内部使用一个私服地址就等于使用了所有需要的外部仓库,可以简化配置。可以配置如下
<mirrors>
<mirror>
<id>internal-rep</id>
<name>Internal Repository Manager</name>
<mirrorOf>*</mirrorOf>
<url>https://xxx/xxx/</url>
</mirror>
</mirrors>
项目中要到的配置如下
<mirrors>
<mirror>
<id>mirror</id>
<mirrorOf>central,jcenter,!rdc-releases,!rdc-snapshots</mirrorOf>
<name>mirror</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
关于</mirrorOf>
语法说明
<mirrorOf>*</mirrorOf>
:配置所有的远程仓库
<mirrorOf>external:*</mirrorOf>
:配置所有远程仓库,使用localhost的除外
<mirrorOf>repo1,repo2</mirrorOf>
:匹配仓库rep1和rep2,用逗号隔开
<mirrorOf>*,!repo1</mirrorOf>
:匹配所有,repo1除外,感叹号仓配置中排出
四、常用仓库搜索服务
MVNrepository
MVNbrowser
Sonatype Nexus
总结
本篇主要介绍了Maven仓库,并结合自己开发中用到的配置加以说明。