Maven 配置文件 proxy、server、repository、mirror 节点笔记
2020/2/25 17:15:42
本文主要是介绍Maven 配置文件 proxy、server、repository、mirror 节点笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
起因
写这篇文章起源于同事一个问题,大概就是进入咱们公司之后,会统一发 maven 的 settings.xml 文件,直接覆盖 maven 自带的就可以正常使用。然后他想知道其中为什么既要配 repository、server 还要配 mirror?这些配置属性含义是什么?这几者之间是什么关系?配了多个 repository 之后查找 jar 的先后顺序是什么?结合 mirror 又会怎么查找?
虽然之前有把 Maven 这块作过系统的笔记(Maven 实战小结),但真的问我这块的时候,才发现遗漏了,现在补一下。
proxy、server、repository、mirror 理解
- proxy 是 maven 所在服务器不能直接访问外网时需要设置的代理服务(不常用)
- server 是当 maven 需要要打包代码上传到私服时,设置私服的鉴权信息,账号+密码
- repository 是 maven 去下载 jar 包的仓库
- mirror 是用于替代 repository 镜像地址
proxy、server 很好理解,所以重点在于 repository、mirror 两者。那么如何区分两者呢?
这里用私服(内部仓库)和镜像(mirror)来做解释:
- internal repository(私服) 是指在局域网内部搭建的 repository,跟 central repository, jboss repository 等的区别仅仅在于其URL是一个内部网址
- mirror(镜像) 则相当于一个代理,会拦截去指定的远程 repository 下载构件的请求,然后从自己这里找出构件回送给客户端。配置 mirror 的目的一般是出于网速考虑。
可以看出,私服和 mirror 是两码事。前者本身是一个 repository,可以用来提供公司内部的 maven 构件;而后者本身并不是 repository,它只是远程 repository 的网络加速器。
不过,很多 internal repository 搭建工具往往也提供 mirror 服务,比如 Nexus 就可以让同一个 URL,既用作 internal repository,又使它成为所有 repository 的 mirror。
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都胡够从它的镜像中获取。举个例子,http://maven.net.cn/content/groups/public/
是中央仓库 http://repo1.maven.org/maven2/
在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的速度。
mirror 的配置
一个 mirror 节点可以对应一个或多个 repository 节点,由 mirrorOf 中的所填的值控制。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <mirrors> <mirror> <id>planetmirror.com</id> <name>PlanetMirror Australia</name> <url>http://downloads.planetmirror.com/pub/maven2</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> ... </settings> 复制代码
- id 属性,mirror 标识(暂时没发现其他地方会引用这个值)
- name 属性,名字,描述
- url 属性,镜像地址
- mirrorOf 属性,该镜像对应的 repository 的 ID(在 Profiles-Repositories-repository-id 中定义)。 例如,要指向 Maven 中央存储库(repo.maven.apache.org/maven2/)的镜像… central。 还可以使用更高级的映射,例如repo1,repo2或* ,!inhouse。此值必须与镜像 ID 不相同。
以下是使用网易的镜像,来替代中央的仓库的配置样例:
<mirrors> <mirror> <id>maven.163.com</id> <name>maven mirror in China</name> <url>http://mirrors.163.com/maven/repository/maven-public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> 复制代码
在实际使用过程中,会有如下的不标准配置:
<mirrors> <mirror> <id>maven.163.com</id> <name>maven mirror in China1</name> <url>http://mirrors.163.com/maven/repository/maven-public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> <mirrors> <mirror> <id>aliyun.com</id> <name>maven mirror in China2</name> <mirrorOf>central</mirrorOf> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors> 复制代码
将两个不同的镜像同时指向 central 仓库,这种方式 maven 只会选取第一个匹配的镜像,也就是 maven.163.com 这个,第二个永远不会生效。官网解释如下:
Note that there can be at most one mirror for a given repository. In other words, you cannot map a single repository to a group of mirrors that all define the same value. Maven will not aggregate the mirrors but simply picks the first match. If you want to provide a combined view of several repositories, use a repository manager instead.
当配置的是对 central 仓库的镜像时,不需要配置 repository 节点信息(因为 maven 默认已经配了)。如果需要了解的更加详细的内容,查看官网 mirror 配置介绍:guide-mirror-settings
repository 的配置
repository 节点必须作为 repositorys 的子节点存在,而 repositorys 节点又必须作为 profiles 节点的子节点存在。
<profiles> <profile> <id>nexus</id> <repositories> <!-- 公司私服配置 --> <repository> <id>you-internal-repos</id> <url>you-internal-repos-address</url> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </snapshots> </repository> <!-- 阿里云私服配置 --> <repository> <id>aliyun-repos</id> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles> <!-- 默认生效 --> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles> 复制代码
mirror、repository 的查找顺序
- 当一个 repository 存在 mirror 时,Maven 查找 jar 时永远使用的是 mirror 配置的地址。
- 当一个 repository 不存在 mirror 时,按照在 repositories 节点中定义的先后顺序。先定义,先查找。
第一点不用验证,就是 Maven 的机制。第二点是自己验证的结果,不再累述验证过程,大概就是删除某个本地已经存在的 jar 再次打包,使用命令 mvn package -X
打包并输出详细调试日志,查找 jar 包的名字关键字,看第一次去哪个远程仓库查,调换远程仓库定义顺序,再次尝试,即可得到结果。
配置实例
以下是一个用阿里云镜像代替中央仓库的配置文件样例:
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>你的本地仓库地址</localRepository> <pluginGroups></pluginGroups> <proxies></proxies> <servers></servers> <mirrors> <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <mirrorOf>central</mirrorOf> <url>https://maven.aliyun.com/repository/public</url> </mirror> <mirror> <id>nexus-mine</id> <name>Nexus mine</name> <mirrorOf>*</mirrorOf> <url>http://xx.xx.xx.xx/nexus/content/groups/public</url> </mirror> </mirrors> </settings> 复制代码
参考
这篇关于Maven 配置文件 proxy、server、repository、mirror 节点笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27数据结构与算法面试题详解及练习
- 2024-12-27网络请求面试题详解与实战
- 2024-12-27数据结构和算法面试真题详解与实战教程
- 2024-12-27网络请求面试真题解析与实战教程
- 2024-12-27数据结构和算法大厂面试真题详解与实战指南
- 2024-12-27TS大厂面试真题解析与应对策略
- 2024-12-27TS大厂面试真题详解与解析
- 2024-12-27网站安全入门:如何识别和修复漏洞
- 2024-12-27SQL注入基础教程
- 2024-12-27初学者指南:理解和修复跨域漏洞