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 | mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=true -DgroupId=com.pollyduan -DartifactId=myweb -Dversion=1.0 -Dpackage=com.pollyduan
创建完成后,为了避免后续测试干扰,先执行一次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
在日志中查看下载依赖的仓库:
Downloaded from settings_mirror: https://maven.aliyun.com/repository/public/junit/junit/4.12/junit-4.12.pom (24 kB at 35 kB/s)
- 可以看出,是从 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
在日志中查看下载依赖的仓库:
Downloaded from pom_repositories: http://10.18.29.128/nexus/content/groups/public/junit/junit/4.12/junit-4.12.pom (24 kB at 95 kB/s)
从显示的仓库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
在日志中查看下载依赖的仓库:
Downloaded from settings_profile_repo: http://mirrors.163.com/maven/repository/maven-public/junit/junit/4.12/junit-4.12.pom (24 kB at 63 kB/s)
从显示的仓库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
在日志中查看下载依赖的仓库:
Downloaded from settings_profile_repo: http://mirrors.163.com/maven/repository/maven-public/junit/junit/4.12/junit-4.12.pom (24 kB at 68 kB/s)
从显示的仓库id可以看出:
- jar 是从 settings_profile_repo 中下载的
- settings_profile_repo 优先级高于 pom_profile_repo
进一步测试:
rm -rf ~/.m2/repository/junit/junit/4.12 mvn compile -Pp_profile
在日志中查看下载依赖的仓库:
Downloaded from pom_profile_repo: http://10.18.29.128/nexus/content/groups/public/junit/junit/4.12/junit-4.12.pom (24 kB at 106 kB/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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Redis 避不开的五种数据结构
Redis 中有 5 种数据结构,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),因为使用 Redis 场景的开发中肯定是无法避开这些基础结构的,所以熟练掌握它们也就成了一项必不可少的能力。本文章精要地介绍了 Redis 的这几种数据结构,主要覆盖了它们各自的定义、基本用法与相关要点。 字符串类型 字符串是 Redis 中的最基础的数据结构,我们保存到 Redis 中的 key,也就是键,就是字符串结构的。除此之外,Redis 中其它数据结构也是在字符串的基础上设计的,可见字符串结构对于 Redis 是多么重要。 Redis 中的字符串结构可以保存多种数据类型,如:简单的字符串、JSON、XML、二进制等,但有一点要特别注意:在 Redis 中字符串类型的值最大只能保存 512 MB。 命令 下面通过命令了解一下对字符串类型的操作: 1.设置值 set key value [EX seconds] [PX milliseconds] [NX|XX] set 命令有几个非必须的选项,下面我们看一下它们的具体说明: EX ...
- 下一篇
Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异
hytrix支持线程池隔离和信号量隔离 信号量隔离适应非网络请求,因为是同步的请求,无法支持超时,只能依靠协议本身 线程池隔离,即,每个实例都增加个线程池进行隔离 先给个总结对比: 隔离方式 是否支持超时 是否支持熔断 隔离原理 是否是异步调用 资源消耗 线程池隔离 支持,可直接返回 支持,当线程池到达maxSize后,再请求会触发fallback接口进行熔断 每个服务单独用线程池 可以是异步,也可以是同步。看调用的方法 大,大量线程的上下文切换,容易造成机器负载高 信号量隔离 不支持,如果阻塞,只能通过调用协议(如:socket超时才能返回) 支持,当信号量达到maxConcurrentRequests后。再请求会触发fallback 通过信号量的计数器 同步调用,不支持异步 小,只是个计数器 看官网的定义引用理解 信号量的隔离: it executes on the calling thread and concurrent requests are limited by the semaphore count - 引自官网 自我理解: 每次调用线程,当前请求通过计数信号量进...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器