浅谈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。
使用如下命令创建测试项目:
创建完成后,为了避免后续测试干扰,先执行一次compile。
cd myweb mvn compile
最后,修改 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的仓库。
mvn compile ... Downloaded from central: https://repo.maven.apache.org/maven2/junit/junit/4.12/junit-4.12.pom (24 kB at 11 kB/s)
可以看出,默认是从 central 中央仓库拉取的jar.
配置镜像仓库 settings_mirror
创建 ~/.m2/setttings.xml ,内容如下:
<settings> <mirrors> <mirror> <id>settings_mirror</id> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings>
重新测试:
rm -rf ~/.m2/repository/junit/junit/4.12 mvn compile
在日志中查看下载依赖的仓库:
可以看出,是从 settings_mirror 中下载的jar
结论:settings_mirror 的优先级高于 central
配置pom中的仓库 pom_repositories
在 project 中增加如下配置:
<repositories> <repository> <id>pom_repositories</id> <name>local</name> <url>http://10.18.29.128/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
由于我们改变了id的名字,所以仓库地址无所谓,使用相同的地址也不影响测试。
执行测试:
rm -rf ~/.m2/repository/junit/junit/4.12 mvn compile
在日志中查看下载依赖的仓库:
从显示的仓库id可以看出:
- jar 是从 pom_repositories 中下载的。
- pom_repositories 优先级高于 settings_mirror
配置全局profile仓库 settings_profile_repo
在 ~/.m2/settings.xml 中 settings 的节点内增加:
<profiles> <profile> <id>s_profile</id> <repositories> <repository> <id>settings_profile_repo</id> <name>netease</name> <url>http://mirrors.163.com/maven/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles>
执行测试:
rm -rf ~/.m2/repository/junit/junit/4.12 mvn compile -Ps_profile
在日志中查看下载依赖的仓库:
从显示的仓库id可以看出:
- jar 是从 settings_profile_repo 中下载的。
- settings_profile_repo 优先级高于 settings_mirror。
- settings_profile_repo 优先级高于 pom_repositories 。
配置项目profile仓库 pom_profile_repo
<profiles> <profile> <id>p_profile</id> <repositories> <repository> <id>pom_profile_repo</id> <name>local</name> <url>http://10.18.29.128/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles>
执行测试:
rm -rf ~/.m2/repository/junit/junit/4.12 mvn compile -Ps_profile,p_profile mvn compile -Pp_profile,s_profile
在日志中查看下载依赖的仓库:
从显示的仓库id可以看出:
- jar 是从 settings_profile_repo 中下载的
- settings_profile_repo 优先级高于 pom_profile_repo
进一步测试:
rm -rf ~/.m2/repository/junit/junit/4.12 mvn compile -Pp_profile
在日志中查看下载依赖的仓库:
从显示的仓库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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 微信加关注链接 一键关注公众号 解决用手机看网页无法扫二维码的烦恼
- springboot mybatis redis 二级缓存
- Elasticsearch强制重置未分配的分片(unassigned)
- 帝国cms调用缩略图和具体文章的方法
- python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护
- python codis集群客户端(二) - 基于zookeeper对实例创建与摘除
- JavaScript replace() 方法
- 别让Open Sans字体拖慢wordpress后台速度
- Oracle 问题小结
- 为帝国cms模板添加站内搜索小教程
- 线程传参
- JQuery 小结
- 错误:该行已经属于另一个表
- RadioButtonList数据项不改变依然执行改变事件
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Jenkins实现自动化邮件发送踩坑记录
- sed 实用实例参考
- 微信小程序WXML页面常用语法(讲解+示例)
- Golang领域模型开篇,当Go遇上DDD
- Spring事务专题(五)聊聊Spring事务到底是如何实现的
- 深色模式适配指南
- 【Flutter 专题】97 仿网易新闻标签选择器
- 宋宝华:论Linux的页迁移(Page Migration)完整版
- 三、玩转Git三剑客-Git与Github的简单同步
- 四、玩转Git三剑客-Git多人单分支集成协作时的常见场景
- 准时下班的秘密:集成 GitLab && JIRA 实现自动化 workflow
- ZLT-MP v4.1.0 发布
- 高并发系统三大利器之限流
- XtraBackup工具详解 Part 2 xtrabackup安装
- XtraBackup工具详解 Part 4 XtraBackup权限及配置