根本原因:idea maven 自定义 setting.xml 配置不生效~
问题描述
为兼容远程办公与个人学习,我的笔记本上 maven 配置有两套,主要区别是镜像设置,一个用的是阿里云 配置文件命名为 settings-alibaba.xml ,一个是公司私服 配置文件为 settings.xml。
settings.xml
settings-alibaba.xml
但是当我在家项目使用settings-alibaba.xml 配置文件时,IDEA无法加载切换到 settings-alibaba.xml,始终会读取 settings.xml 。这应该是IDEA的一个bug吧。
可以看到依旧是使用的公司私服
检查了 idea 的配置,都是正常的。但是就是不读取。
解决方案
在网上看了很多方法,都太复杂,有些并没有效果。
方法一:
在自定义配置settings.alibaba.xml中,将
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
改为
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
先说mirrors中mirror的作用,mirrors允许配置多个镜像mirror,mirror的作用一般是为了使用一个更快速度的镜像,主要是访问速度的考虑,或者突破屏蔽使用可以访问的镜像。
在maven中不配置mirror时使用的maven的中央库。
在maven中配置一个mirror时,mirror通常会设置成*,还有可能是一个具体的值,还有可能是逗号隔开的几个值…
例如:
1.*
2.repo3
3.repo1,repo2,*,!repo3
4.external:*
在上面4个例子中,第一个例子中*的意思就是(根据mirrorOf和repository的id)匹配所有的库(repository),这样就是说如果你需要某个jar,他会从镜像地址去下载这个jar。不管你配置了多少个库,即使这些库的地址不一样,仍然会从镜像地址访问,这里就产生了问题。
问题:为什么我配置好了库(repository),但是下载不下来(或者下载地址不对)?
这个问题已经很明白了,就是镜像(mirror)的问题。
问题:如何解决上述问题呢?
这里请继续看第二个例子和第三个例子。
第二个例子只配置了一个repo3,这个镜像只能匹配id是repo3的库,该库会使用repo3的镜像访问。这里说重点了,即使还存在一个*的,这里会先查找完全相同的存储库标识符匹配的镜像,如果找到了,就用匹配的,这里就是repo3,这点可以放心。如果找不到,那就去根据其他的mirrorOf查找去,查找到一个就使用。这里需要注意的是,如果存在多个重复的mirrorOf,只会用排名靠前的第一个(按照配置顺序来)。如果一个都没有,就会用maven中央库。
第三个例子是用逗号隔开的好几个,并且有一个特殊的!repo3,一般!的意思是非,这里的意思就是,就是排除repo3的情况。综合起来第三个的含义就是完全匹配repo1,repo2和其他全部库,排除repo3库。
到这里,第二个问题已经有了答案,给这个库配置单独的镜像,而且位置尽量在前面,id和mirrorOf一致。说到这两个一致,还得说两个不能一致的情况,就是mirror的mirrorOf不能和任何mirror的id一致,因为id在setting中唯一,mirrorOf要和库的id一致,所以势必不能和mirror的id一致,如果一致显然就起不到作用了(这里属于猜测,官方要求不能一致)。
第四个例子很特殊,含义就是匹配本地库之外的全部库。如果本地库存在,就用本地库的。
方法二:
在不改动<mirrorOf>central</mirrorOf>
的情况下,在IDEA的maven中修改
去掉默认 √ 选项
为什么呢?
因为这是我们公司settings.xml的<profiles>
中配置id,如图
不采用这个配置就默认从maven的中央仓库拉取jar包!