1.问题情况
🌿 英文报错
com.qiniu:qiniu-java-sdk/maven-metadata.xmlfailed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repository and resolution will not be reattempted until the update interval of maven-default-http-blocker has elapsed or updates are forced. Original error: Could not transfer metadata com.qiniu:qiniu-java-sdk/maven-metadata.xml from/to maven-default-http-blocker (http://0.0.0.0/): transfer failed for http://0.0.0.0/com/qiniu/qiniu-java-sdk/maven-metadata.xml
🌿 中文意思
com.qiniu:qiniu java sdk/maven元数据。xml无法从转移http://0.0.0.0/在先前的尝试期间。此故障缓存在本地存储库中,在maven默认http拦截器的更新间隔结束或强制更新之前,不会重新尝试解决。原始错误:无法传输元数据com.qiniu:qiniu java sdk/maven元数据。xml从/到maven默认http拦截器(http://0.0.0.0/):传输失败http://0.0.0.0/com/qiniu/qiniu-java-sdk/maven-metadata.xml
2.问题分析
因为使用HTTP协议下载依赖,可能会导致中间人攻击。所以Maven 3.8.1就在默认配置文件中增加了一组标签,禁止了所有HTTP协议的Maven仓库。
因此使用maven3.8.1,如果仓库镜像是http 而不是https 就会被拦截禁止访问。
很多公司内部的maven仓库一般都是http协议,而Maven 3.8.1禁止了http协议,那么就会导致一些报错。
中间人攻击解释来自:中间人攻击
所谓中间人攻击就是在A和B通信的过程中加入了恶意攻击者C。C作为中间人转发两者的请求。
上面是一个完整的中间人攻击流程:
- A向B请求公钥,但是却被C截获。
- C向B发送公钥请求。
- B将公钥发给C。
- C截获了B的公钥,然后替换成自己的公钥发给A。
- A将C的公钥当成了B的公钥,并用其加密信息,发给B。
- C截获了加密信息,用自己的私钥解密,获得明文。同时伪造新的信息,再用B的公钥加密,发给B。
- B获得加密信息,用自己的私钥解密。
3.问题解决
如果你为idea配置的settings.xml是含有如下:
将该组mirror标签注释掉即可,如下图:
4.其它思考(一定要看)
其实我感到很诧异,上述settings.xml我早已经不再使用,我是为Idea指定了新的settings.xml文件,放在了用户文件下的.m2下,并且修改为了阿里镜像。
按道理来说是没有拦截http的标签(在指定新的settings.xml时已经被我删除),而且这个报错问题也是突然发生的,之前没遇见过。
但考虑到报错信息中谈到了http被拦截问题,并且我并未去注释idea自带settings,xml的http拦截器标签,于是我在阿里镜像的url中修改成了https路径:
保存过后再去项目中刷新maven或者执行clean、package、install等操作,没有再报错了。
这就很奇怪了,我明明指定的.m2文件下没有拦截标签的settings.xml文件,却依旧是参考了idea自带settings.xml文件中的http被拦截规则(http拦截器生效),导致 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
中由于访问路径是http而被http拦截器拦截而报错。
考虑到之前进行的所有Maven操作我都是能正常使用,这次的报错偶然性的,因为我在后来又将.m2下的settings.xml中的路径改为了http,并且并没有注释掉idea自带settings.xml的http拦截器标签,因此我目前只能归结为是 idea 的系统混乱Bug。