Maven:mirror和repository 区别
一、为什么不理解这两者的区别?
# 授之以鱼,不如授之以渔。#
很多时候我们不懂陌生的东西,主要还是对这两者本身的功能属性不了解,才会出现根本看不懂区别在哪,所以问题需要看本质。可以从以下几个步骤入手:
(1)字面意思,
mirror:镜像,我们开发过程中见到非常多镜像场景,比如经常会看到国外的一些网站访问很慢,我们回去清华或者阿里之类的镜像网站去下载对应资源,到这里应该就比较好理解了。
repository:仓库,只要使用maven的人,对于仓库的概念应该不会陌生,我们开发经常需要依赖非常多的一些第三方包,这个时候,不可能在每个项目模块中添加对应的仓库地址,太过冗余,最简单的办法是在本地的setting配置中统一添加本地仓库、中央仓库和远程仓库;
关于概念,说句实在话,对于这种广泛使用的工具,个人感觉用词非常贴切,所以呢,重要的事情说三遍。官方文档!官方文档!官方文档!
(2)经验
关于这一点,可能确实依赖平时经验总结,比如上面官方文档提到的,如果你不想或者不敢修改你原有配置的时候,就可以使用镜像的方式去指定替代前面repository中定义的具体仓库,也就是上面中定义的具体名称的仓库。
(3)扩展
能不能有针对性的对我某些repository进行镜像转发请求呢,即我定义了多个远程仓库(由<repositories/>定义),只转发我指定的远程仓库的依赖包的下载请求呢?再仔细想想,其实很简单,具体下面描述。
二、具体原理是怎么样的?
介绍前需要先说明一下maven第三方依赖管理的大致逻辑:
- 步骤一:优先查询本地仓库地址是否存在,不存在,继续;
- 步骤二:从配置的center repository 下载,没找到,继续;
- 步骤三,依次从配置的<repositories>下配置的一个或者多个远程仓库下载,如果均请求不到,就会报错了;
根据我们上面思考的扩展点,查看官方文档:
<mirrorOf>属性用法示例:
- * = everything 拦截所有 <repositories>下配置的远程下载请求。
- external:* = everything not on the localhost and not file based. 拦截所有本地没有且 <repositories>未配置的请求,换句话说,就是前面都查过,但是查不到的情况下,还会继续从<mirror>中定义的url下载。
- repo,repo1 = repo or repo1 拦截指定 <repositories>名称的远程地址请求,从<mirror>中定义的url下载。
*,!repo1 = everything except repo1 拦截除了 <repositories>名称为repo1的远程地址请求,其他均从<mirror>中定义的url下载。
setting.xml文件的其他属性,官方文档都有详细的说明和示例。