浅谈Maven 项目中依赖的搜索顺序
网上有很多关于maven项目中mirror、profile、repository的搜索顺序的文章,说法不一。官方文档并没有找到相关的说明,鉴于此,我抽时间做了一个验证。
依赖仓库的配置方式
maven项目使用的仓库一共有如下几种方式:
- 中央仓库,这是默认的仓库
- 镜像仓库,通过sttings.xml中的settings.mirrors.mirror配置
- 全局profile仓库,通过settings.xml中的settings.repositories.repository配置
- 项目仓库,通过pom.xml中的project.repositories.repository配置
- 项目profile仓库,通过pom.xml中的project.profiles.profile.repositories.repository配置
- 本地仓库
如果所有配置都存在,依赖的搜索顺序就会变得异常复杂。
分析依赖搜索顺序
先从最简单开始,慢慢增加配置,查看有什么变化。
准备测试环境
安装jdk、maven。
使用如下命令创建测试项目:
yes|mvnarchetype:generate-DarchetypeGroupId=org.apache.maven.archetypes-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=true-DgroupId=com.pollyduan-DartifactId=myweb-Dversion=1.0-Dpackage=com.pollyduan
创建完成后,为了避免后续测试干扰,先执行一次compile。
cdmyweb mvncompile
最后,修改pom.xml文件,将junit版本号改为4.12。我们要使用这个jar来测试依赖的搜索顺序。
默认情况
首先确保junit4.12不存在:
rm-rf~/.m2/repository/junit/junit/4.12
默认情况下没有配置任何仓库,也就是说,既没改$M2_HOME/conf/settings.xml也没有添加~/.m2/settings.xml
执行编译,查看日志中拉取junit的仓库。
mvncompile ... Downloadedfromcentral:https://repo.maven.apache.org/maven2/junit/junit/4.12/junit-4.12.pom(24kBat11kB/s)
可以看出,默认是从central中央仓库拉取的jar.
配置镜像仓库settings_mirror
创建~/.m2/setttings.xml,内容如下:
settings_mirror https://maven.aliyun.com/repository/public central
重新测试:
rm-rf~/.m2/repository/junit/junit/4.12 mvncompile
在日志中查看下载依赖的仓库:
Downloadedfromsettings_mirror:https://maven.aliyun.com/repository/public/junit/junit/4.12/junit-4.12.pom(24kBat35kB/s)
可以看出,是从settings_mirror中下载的jar
结论:settings_mirror的优先级高于central
配置pom中的仓库pom_repositories
在project中增加如下配置:
pom_repositories local http://10.18.29.128/nexus/content/groups/public/ true true
由于我们改变了id的名字,所以仓库地址无所谓,使用相同的地址也不影响测试。
执行测试:
rm-rf~/.m2/repository/junit/junit/4.12 mvncompile
在日志中查看下载依赖的仓库:
Downloadedfrompom_repositories:http://10.18.29.128/nexus/content/groups/public/junit/junit/4.12/junit-4.12.pom(24kBat95kB/s)
从显示的仓库id可以看出:
- jar是从pom_repositories中下载的。
- pom_repositories优先级高于settings_mirror
配置全局profile仓库settings_profile_repo
在~/.m2/settings.xml中settings的节点内增加:
s_profile settings_profile_repo netease http://mirrors.163.com/maven/repository/maven-public/ true true
执行测试:
rm-rf~/.m2/repository/junit/junit/4.12 mvncompile-Ps_profile
在日志中查看下载依赖的仓库:
Downloadedfromsettings_profile_repo:http://mirrors.163.com/maven/repository/maven-public/junit/junit/4.12/junit-4.12.pom(24kBat63kB/s)
从显示的仓库id可以看出:
- jar是从settings_profile_repo中下载的。
- settings_profile_repo优先级高于settings_mirror。
- settings_profile_repo优先级高于pom_repositories。
配置项目profile仓库pom_profile_repo
p_profile pom_profile_repo local http://10.18.29.128/nexus/content/groups/public/ true true
执行测试:
rm-rf~/.m2/repository/junit/junit/4.12 mvncompile-Ps_profile,p_profile mvncompile-Pp_profile,s_profile
在日志中查看下载依赖的仓库:
Downloadedfromsettings_profile_repo:http://mirrors.163.com/maven/repository/maven-public/junit/junit/4.12/junit-4.12.pom(24kBat68kB/s)
从显示的仓库id可以看出:
- jar是从settings_profile_repo中下载的
- settings_profile_repo优先级高于pom_profile_repo
进一步测试:
rm-rf~/.m2/repository/junit/junit/4.12 mvncompile-Pp_profile
在日志中查看下载依赖的仓库:
Downloadedfrompom_profile_repo:http://10.18.29.128/nexus/content/groups/public/junit/junit/4.12/junit-4.12.pom(24kBat106kB/s)
从显示的仓库id可以看出:
- jar是从settings_profile_repo中下载的
- pom_profile_repo优先级高于pom_repositories
最后确认local_repo本地仓库~/.m2/repository
这不算测试了,只是一个结论,可以任意测试。
只要~/.m2/repository中包含依赖,无论怎么配置,都会优先使用local本地仓库中的jar.
最终结论
- settings_mirror的优先级高于central
- settings_profile_repo优先级高于settings_mirror
- settings_profile_repo优先级高于pom_repositories
- settings_profile_repo优先级高于pom_profile_repo
- pom_profile_repo优先级高于pom_repositories
- pom_repositories优先级高于settings_mirror
通过上面的比较得出完整的搜索链:
local_repo>settings_profile_repo>pom_profile_repo>pom_repositories>settings_mirror>central
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。