场景
有一个项目,我把代码跟本地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
依赖包,都可以下载成功。