在maven使用的过程中通常会遇到依赖报错的问题,可能是原始仓库https://repo.maven.apache.org/maven2访问慢,或者你配置了其他代理镜像比如阿里云,网易等等,还或者是明明本地仓库有依赖,但是刷新maven依然报错。。
我们先来看一下基本的settings.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:\repository</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
<server>
<id>njbh-nexus</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>njbh</id>
<repositories>
<repository>
<id>njbh-nexus</id>
<url>http://192.168.5.244:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>163</id>
<repositories>
<repository>
<id>163-nexus</id>
<url>http://mirrors.163.com/maven/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
</settings>
简单描述一下配置内容
1.mirrors用于配置镜像,由于maven官方下载地址在国外会很慢,我们一般可以配置阿里云等第三方镜像,mirror配置具体的镜像地址,id是唯一标识,不重复就行随便写都可以,mirrorOf相当于拦截器,拦截哪些仓库会走这个镜像下载,maven如果没有指定仓库的话就是central,所以我们配置central就相当于取代了原始的仓库下载地址,尽量不要配*,配置了*就相当于所有仓库都从这个镜像下载,这样就没有意义,url就是配置的镜像地址,一般阿里云就够了,而且配置多个mirrorOf一样的mirror是没有效果的,只会访问第一个
2.profiles用于具体配置,可以配置多个profile,这里我们配置了两个仓库地址,一个是公司内部的仓库,一个是163仓库,profile中的id配置好后可以在idea的mavne工具上的profiles中显示,repositorys配置你的仓库,如果仓库需要账号密码认证的话在server中配置就可以了,server中id对应的就是repository中的id,releases和snapshots是两个版本类型都为true就行
复现一下常见的依赖下载报错问题和解决方案
问题:idea导入项目的时加载maven发现依赖报错
解决:删除项目中的idea文件夹和iml文件(有些版本的idea可能没有生成iml文件,那就只删除idea文件夹就可以了),然后重新导入项目
问题:当你在settings.xml的profile中配置了repository,并且激活,但是下载依赖下载不了,但是你的central配置是可以下载的
解决:那你只需要再刷新一下mavne就可以了,因为他下载不了最后会去中央仓库下载,虽然页面显示下载报错,但是中央仓库已经下载成功了,并且本地仓库依赖包也是存在的
问题:当你使用内网下载了一个内部独有的依赖并且下载成功了,查看本地仓库没有问题,然后换了一个仓库地址后比如阿里云,刷新maven会提示依赖下载报错
解决:找到对应本地仓库的依赖文件夹,在具体的版本文件夹里面有一个_remote.repositories文件,里面记录着镜像下载缓存,修改>***=中的***为你更换的仓库id,再次刷新maven(如果还行不行可以重启idea)也可以将***去掉只保留>=代表着只要本地有这个依赖,更换任何仓库都不会再去尝试下载他(可以去尝试使用maven命令手动将jar install到本地查看_remote.repositories中的信息)
---------------------------------------------------------------------------------------------------------------------------------
如果你想配置多个仓库一起使用,内网下载不了的依赖自动去下一个仓库地址下载,不需要手动切换的话可以,只要配置多个profile,然后给他都激活就可以了,一般下载顺序就是配置的顺序,在settings根目录下配置(也可以一个profile配置多个repository,效果是一样的)
<activeProfiles>
<activeProfile>profile1的id</activeProfile>
<activeProfile>profile2的id</activeProfile>
</activeProfiles>
或者在对应profile根目录下配置
<activation>
<activeByDefault>true</activeByDefault>
</activation>
可以在idea中看到,加载maven项目的时候是默认选中的
注:maven仓库下载顺序
1.如果settings.xml中配置了mirror的mirrorOf为*的话就是最高级,只从这个地址下载
2.在项目pom.xml中直接配置repository,并且settings.xml中的mirrorOf没有拦截此仓库id(测试过程中不稳定,有点时候优先级高于3和4)
3.在settings.xml中的profile配置了repository(一个profile可以配置多个repository,下载的时候会按顺序挨个下载,直到找到依赖为止)并且激活配置,如果有多个配置一起激活的话,按profile配置的顺序挨个下载,直到找到依赖为止,一定要注意如果激活的配置仓库都下载不了的话,最后还是会去中央仓库去下载(这种配置方式优先级比pom.xml的profile高,如果settings.xml和pom.xml各配置了一个profile并且都是激活状态下,会只执行settings.xml中的仓库地址,即使依赖下载不了也不会去pom.xml配置的profile仓库去下载)
4.在项目pom.xml中的profile配置了repository(一个profile可以配置多个repository,下载的时候会按顺序挨个下载,直到找到依赖为止)并且激活配置,如果有多个配置一起激活的话,按profile配置的顺序挨个下载,直到找到依赖为止,一定要注意如果激活的配置仓库都下载不了的话,这种在pom.xml中配置的方式即使依赖下载不了最后也不会再去中央仓库下载
5.如果没有配置任何仓库地址,或者配置了一个也没有激活的话会默认使用central仓库(如果mirror的mirrorOf配置为central的话为走配置的url,啥也没有配置的话会走https://repo.maven.apache.org/maven2)