场景
有一个项目,我把代码跟本地maven依赖包从同事那里拷贝过来,然后打包却一直打不了,一直报aliyun仓库找不到这个依赖的错误,无论我改成引用本地仓库还是线上aliyun仓库都不行。
依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.1.0.M1</version></dependency>
原因
就是因为
openfeign
的2.1.0.M1
版本并不是Central(中央仓库)
里的,而是Spring Milestones
里的,而现在我的settings.xml
中只配置了拉取Central
仓库,所以对于Spring Milestones
里面的依赖包肯定是拉取失败的。
Central、Spring Milestones、ICM的区别
如下图所示:https://mvnrepository.com中一共三种仓库。
Central:中央仓库,托管了大量的开源库及其依赖,可靠性和稳定性高
,发布的库经过验证。
Spring Milestones:包含了Spring项目的最新进展,可能具有新特性但未经充分测试
,可能会有不稳定的情况出现,不适合在生产环境中使用
。
ICM:并不是一个通用的公共Maven仓库,通常用于企业内部
,以减少对外部网络的依赖或满足安全要求。
解决
1、修改settings.xml文件,同时支持两个仓库。
<mirrors><mirror><id>aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror><mirror><id>spring-milestones</id><name>Spring Milestones Repository</name><url>https://repo.spring.io/milestone</url><mirrorOf>*</mirrorOf></mirror>
</mirrors><profiles><profile><id>aliyun</id> <repositories><repository><id>aliyun</id> <url>https://maven.aliyun.com/repository/public</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled> </snapshots></repository></repositories></profile><profile><id>spring-milestones</id><activation><activeByDefault>false</activeByDefault></activation><repositories><repository><id>spring-milestones</id><url>https://repo.spring.io/milestone</url><layout>default</layout><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></repository></repositories></profile>
</profiles> <!--激活profile,activeProfile元素中指定profile的id-->
<activeProfiles><activeProfile>aliyun</activeProfile><activeProfile>spring-milestones</activeProfile>
</activeProfiles>
2、mvn clean install还是报错。
Could not transfer metadata commons-fileupload:commons-fileupload/maven-metadata.xml from/to spring-milestones (https://repo.spring.io/milestone): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
原因:spring-milestones仓库在下载包的时候遇到了SSL证书验证问题。
3、修改settings.xml文件,spring-milestones
仓库的profile
跳过SSL认证。
<profile><id>spring-milestones</id><activation><activeByDefault>false</activeByDefault></activation><repositories><repository><id>spring-milestones</id><url>https://repo.spring.io/milestone</url><layout>default</layout><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots><!--跳过SSL认证--><transportOptions><transportOption>http.nonProxyHosts=repo.spring.io</transportOption><transportOption>maven.wagon.http.ssl.insecure=true</transportOption><transportOption>maven.wagon.http.ssl.allowall=true</transportOption></transportOptions></repository></repositories></profile>
4、mvn clean install还是报错,没有跳过SSL认证,跟第2步报的错一样。
5、通过命令的形式来跳过SSL认证。
直接执行:
mvn clean install -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true
6、执行后,过一会无论Central
依赖包还是Spring Milestones
依赖包,都可以下载成功。