Maven是一个流行的Java项目构建和管理工具。在Maven中,我们可以配置多个仓库源来下载和管理依赖项。同时,我们还可以使用repositories和mirrors进行配置,以满足特定的需求。
首先,让我们了解一下repositories和mirrors的作用。在Maven的Setting配置中,repositories和mirrors都用于配置远程仓库的地址。其中,repository直接配置站点地址,而mirror则作为站点的镜像,代理某个或某几个站点的请求,实现对repository的完全代替。要配置多个仓库源,有两种形式可供选择:配置多个profile或在一个profile中配置多个repository。配置多个profile时,需要额外配置activeProfiles使配置生效。这样,在下载依赖时,Maven会按照配置从上到下的顺序,依次尝试从各个地址下载,成功下载为止。无论是配置国内的Maven仓库,还是配置Nexus等私服,都可以直接配置成repository。这样即使配置的这些仓库有些问题导致一些包下不下来,也可以继续用别的仓库尝试。
接下来,我们来看一下如何使用mirror进行配置。mirror作为站点的镜像,可以代理某个或某几个站点的请求。我们可以将mirror配置为对某个repository的完全代替。在Mirrors部分可以配置多个镜像仓库,但是在该部分配置多个仓库并不能提供自动查询多个仓库的功能,默认还是取第一个仓库进行查询。为了达到这个目的,我们可以采用设置profiles的方式进行配置。
下面是一个示例配置:
<profiles> <profile> <id>my-profile</id> <repositories> <repository> <id>repo1</id> <url>http://repo1.example.com/maven2/</url> </repository> <repository> <id>repo2</id> <url>http://repo2.example.com/maven2/</url> </repository> </repositories> <mirrors> <mirror> <id>mirror1</id> <mirrorOf>repo1</mirrorOf> <url>http://mirror1.example.com/maven2/</url> </mirror> <mirror> <id>mirror2</id> <mirrorOf>repo2</mirrorOf> <url>http://mirror2.example.com/maven2/</url> </mirror> </mirrors> </profile> </profiles>
在上述示例中,我们通过设置多个repository和mirror来配置多个仓库源。其中,repository标签下的id表示仓库的唯一标识符,url表示仓库的地址。mirror标签下的id表示镜像的唯一标识符,mirrorOf表示要代理的repository的id,url表示镜像的地址。通过这种方式,我们可以实现对多个仓库源的灵活配置和管理。
总结:在Maven中配置多个仓库源时,可以使用repositories和mirrors进行配置。repositories直接配置站点地址,而mirrors作为站点的镜像,代理某个或某几个站点的请求。通过设置多个profile或在一个profile中配置多个repository来配置多个仓库源。同时,使用mirror可以实现镜像仓库的配置,以满足特定的需求。通过灵活运用这些配置方式,我们可以更好地管理依赖项和解决依赖问题。
maven 设置多个仓库
有两种不同的方式可以指定多个存储库的使用。第一种方法是在 POM 中指定要使用的存储库。这在构建概要文件内部和外部都支持
<project>
...
<repositories>
<repository>
<id>my-repo1</id>
<name>your custom repo</name>
<url>http://jarsm2.dyndns.dk</url>
</repository>
<repository>
<id>my-repo2</id>
<name>your custom repo</name>
<url>http://jarsm2.dyndns.dk</url>
</repository>
</repositories>
...
</project>
另一种指定多个存储库的方法是在${user.home}/.m2/settings.xml
或者 ${maven.home}/conf/settings.xml
文件中 新建 profile
信息 如下:
<settings>
...
<profiles>
// 第一个仓库地址
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>my-repo2</id>
<name>your custom repo</name>
<url>http://jarsm2.dyndns.dk</url>
</repository>
</repositories>
</profile>
// 第二个仓库地址
<profile>
<id>aliyun</id>
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
<activeProfile>aliyun</activeProfile>
</activeProfiles>
...
</settings>
如果您在profiles
中指定 repository
存储库,需要激活该特定profiles
,我们通过在 activeProfiles
中进行配置
你也可以通过执行以下命令来激活这个配置文件:
mvn -Pnexus ...
正常maven 的settings.xml配置完成profiles之后,可以在idea中进行切换
设置镜像
镜像 相当于拦截机。它拦截 maven 对远程存储库的请求,将请求中的远程存储库地址重定向到镜像中配置的地址。它主要提供了一个方便的方式来切换远程仓库地址。镜像地址按照配置文件中的顺序执行。例如,在公司工作时,使用电信网络,连接到电信仓库。当我回家的时候,是联通的网络。我想连接联通的仓库。我可以通过镜像配置将我的项目的仓库地址变成联通,而不是在特定的项目配置文件中逐个地改变地址
<settings>
...
<mirrors>
<mirror>
<id>aliyun</id>
<name>Maven Repository Manager running on repo.mycompany.com</name>
<url>http://repo.mycompany.com/proxy</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
...
</settings>
配置说明:
•id
: 镜像的唯一标识
•mirrorOf
: 指定镜像规则,什么情况下从镜像仓库拉取,mirrorOf表示要代理的repository的id
•*
: 匹配所有,所有内容都从镜像拉取
•external:*
: 除了本地缓存的所有从镜像仓库拉取
•repo,repo1
: repo 或者 repo1 ,这里的 repo 指的仓库 ID
•*,!repo1
: 除了 repo1 的所有仓库
•name
: 名称描述
•url
: url表示镜像的地址
示列: 针对aliyun 仓库进行设置镜像重定向到镜像中配置的地址
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>aliyun</mirrorOf>
<name>ppd mirror</name>
<url>http://repo.mycompany.com/proxy</url>
</mirror>
</mirrors>
这个时候会发现 虽然 repository 配置的是正确aliyun 地址,但是由于mirror镜像拦截的原因重定向新的url.
mirrors 与profiles 设置repository的区别
mirror 与 repository 不同的是,假如配置同一个 repository 多个 mirror 时,相互之间是备份关系,只有当仓库连不上时才会切换到另
一个,而如果能连上但是找不到依赖时是不会尝试下一个 mirror 地址的