背景:
自己在平时写项目用的是阿里的镜像地址,而在开发公司的项目是用的是公司提供的镜像地址,这就导致了每次使用的时候
都需要来回的修改maven的settings.xml文件,这样很容易出错,而且还浪费时间;
需求:希望能够不改动配置文件的情况下,动态切换mirror配置;
分析:
在maven的配置文件setting.xml大里面有个mirrors节点,用来配置镜像URL。mirrors可以配置多个mirror,每个mirror有id,name,url,mirrorOf属性,
id是唯一标识一个mirror,name节点名,url是官方的库地址,mirrorOf代表了一个镜像的替代位置,例如central就表示代替官方的中央库。
虽然mirrors可以配置多个子节点,但是它只会使用其中的一个节点,即默认情况下配置多个mirror的情况下,只有第一个生效,只有当前一个mirror
无法连接的时候,才会去找后一个;而我们想要的效果是:当a.jar在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载,但是maven不会这样做!)。
那么maven是使用哪个mirror节点的呢?
默认:mirror不是按settings.xml中写的那样的顺序来查询的,即所谓的第一个并不一定是最上面的那个。
当有id为B,A,C的顺序的mirror在mirrors节点中,maven会根据字母排序来指定第一个,所以不管怎么排列,
一定会先找到A这个mirror来进行查找,当A无法连接,出现意外的情况下,才会去B查询。
注意:
配置多个mirror时,mirrorOf不能配置" * "," * " 的意思就是(根据mirrorOf和repository的id)匹配所有的仓库(repository),
这样就是说如果你需要某个jar,他会从镜像地址去下载这个jar。不管你配置了多少个库,即使这些库的地址不一样,仍然会从镜像地址访问。
解决办法:
settings.xml 中可以使用变量,可以尝试使用变量解决:
<!-- mirror | Specifies a repository mirror site to use instead of a given repository. The repository that | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used | for inheritance and direct lookup purposes, and must be unique across the set of mirrors. | <mirror> --> <!-- 唯一标识一个mirror --> <id>mirrorId</id> <!-- 代表这个镜像的替代位置,例如central就表示替代官方的中央仓库。我们可以将这个地方设置为变量,然后通过手动指定变量地方式动态切换mirror --> <!-- mirrorOf指定这个镜像是针对哪个repository的,配置成*就表示要代理所有repository的请求 --> <mirrorOf>repositoryId</mirrorOf> <!-- 名字(个人感觉这个name作用主要是给自己识别用,因为id已经在当前xml中唯一指定了一个mirror) --> <name>Human Readable Name for this Mirror.</name> <!-- 官方仓库库的地址 --> <url>http://my.repository.com/repo/path</url> </mirror>
实例:
<mirrors> <mirror> <id>aliyun</id> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>${aliyun}</mirrorOf> </mirror> <mirror> <id>netease</id> <url>http://mirrors.163.com/maven/repository/maven-public/</url> <mirrorOf>${netease}</mirrorOf> </mirror> <mirror> <id>default</id> <url>http://ip/nexus/repository/maven-public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
切换命令:
配置多个mirror的情况下,默认只有第一个生效。因此我们可以把最后一个作为默认值,前面配置的使用环境变量动态切换。
默认执行: mvn help:effective-settings可以看到使用的是最后一个
切换阿里镜像执行mvn help:effective-settings -Daliyun=central即可
同理,切换网易mvn help:effective-settings -Dnetease=central
参考:Maven 的 settings.xml 配置中的mirror节点
maven的setting配置文件中mirror和repository的区别
maven动态切换mirror,无需修改settings.xml