我的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 >X:\工具\maven资源\repository</ localRepository >
< pluginGroups ></ pluginGroups >
< proxies ></ proxies >
< servers ></ servers >
< mirrors >
< mirror >
< id >nexus-aliyun</ id >
< name >Nexus aliyun</ name >
< mirrorOf >central</ mirrorOf >
< url >http://maven.aliyun.com/nexus/content/groups/public</ url >
</ mirror >
< mirror >
< id >nexus-mine</ id >
< name >Nexus mine</ name >
< mirrorOf >*</ mirrorOf >
< url >http://xx.xx.xx.xx/nexus/content/groups/public</ url >
</ mirror >
</ mirrors >
< profiles ></ profiles >
</ settings >
|
nexus-aliyun使用阿里云的镜像作为central中央仓库
nexus-mine作为私服,mirrorOf配置为*来提供中央仓库中不存在的jar包
---------------------------------------------------------------没时间下面不用看了-----------------------------------------------------------------------------
一、概述
maven的settings.xml文件里面有proxy、server、repository、mirror的配置,在配置仓库地址的时候容易混淆
proxy是服务器不能直接访问外网时需要设置的代理服务,不常用
server是服务器要打包上传到私服时,设置私服的鉴权信息
repository是服务器下载jar包的仓库地址
mirror是用于替代仓库地址的镜像地址
下面查看源码来确定repository和mirror的优先顺序
二、初始化远程仓库
在maven的远程仓库初始化时会执行newRepositorySession方法,会创建mirror、proxy、authentication和其它系统环境信息:
this .mavenRepositorySystem.injectMirror(request.getRemoteRepositories(), request.getMirrors());
this .mavenRepositorySystem.injectProxy(session, request.getRemoteRepositories());
this .mavenRepositorySystem.injectAuthentication(session, request.getRemoteRepositories());
|
三、遍历注入镜像
在injectMirror方法中:
public void injectMirror(List<ArtifactRepository> repositories, List<Mirror> mirrors)
{
if ((repositories != null ) && (mirrors != null )) {
for (ArtifactRepository repository : repositories)
{
Mirror mirror = getMirror(repository, mirrors);
injectMirror(repository, mirror);
}
}
}
|
遍历repositories,获得mirror然后注入mirror
注:这里不用担心repositories没数据,因为在之前的初始化repositories方法中会判断没有配置"central"中央仓库的时候加入默认仓库
private void injectDefaultRepositories(MavenExecutionRequest request)
throws MavenExecutionRequestPopulationException
{
Set<String> definedRepositories = this .repositorySystem.getRepoIds(request.getRemoteRepositories());
if (!definedRepositories.contains( "central" )) {
try
{
request.addRemoteRepository( this .repositorySystem.createDefaultRemoteRepository(request));
}
catch (Exception e)
{
throw new MavenExecutionRequestPopulationException( "Cannot create default remote repository." , e);
}
}
}
|
public ArtifactRepository createDefaultRemoteRepository(MavenExecutionRequest request)
throws Exception
{
return createRepository( "https://repo.maven.apache.org/maven2" , "central" , true , "daily" , false , "daily" , "warn" );
}
|
三、匹配镜像
在getMirror方法中:
public static Mirror getMirror(ArtifactRepository repository, List<Mirror> mirrors)
{
String repoId = repository.getId();
if ((repoId != null ) && (mirrors != null ))
{
for (Mirror mirror : mirrors) {
if ((repoId.equals(mirror.getMirrorOf())) && (matchesLayout(repository, mirror))) {
return mirror;
}
}
for (Mirror mirror : mirrors) {
if ((matchPattern(repository, mirror.getMirrorOf())) && (matchesLayout(repository, mirror))) {
return mirror;
}
}
}
return null ;
}
|
忽略不常用的layout配置,第一个循环优先寻找mirrorOf与repositoryId完全相同的mirror
第二个循环通过规则来匹配mirror,matchPattern的方法:
static boolean matchPattern(ArtifactRepository originalRepository, String pattern)
{
boolean result = false ;
String originalId = originalRepository.getId();
if (( "*" .equals(pattern)) || (pattern.equals(originalId)))
{
result = true ;
}
else
{
String[] repos = pattern.split( "," );
for (String repo : repos) {
if ((repo.length() > 1 ) && (repo.startsWith( "!" )))
{
if (repo.substring( 1 ).equals(originalId))
{
result = false ;
break ;
}
}
else
{
if (repo.equals(originalId))
{
result = true ;
break ;
}
if (( "external:*" .equals(repo)) && (isExternalRepo(originalRepository))) {
result = true ;
} else if ( "*" .equals(repo)) {
result = true ;
}
}
}
}
return result;
}
|
如果是mirrorOf是*号就匹配,如果不是就遍历可能是逗号分隔的mirrorOf值,同时看是否是!号排除的
在找到mirror后会执行injectMirror方法,把匹配的mirror注入到repository里面:
private void injectMirror(ArtifactRepository repository, Mirror mirror)
{
if (mirror != null )
{
ArtifactRepository original = createArtifactRepository(repository.getId(), repository.getUrl(), repository.getLayout(), repository
.getSnapshots(), repository.getReleases());
repository.setMirroredRepositories(Collections.singletonList(original));
repository.setId(mirror.getId());
repository.setUrl(mirror.getUrl());
if (StringUtils.isNotEmpty(mirror.getLayout())) {
repository.setLayout(getLayout(mirror.getLayout()));
}
}
}
|
四、总结
1、在mirrorOf与repositoryId相同的时候优先是使用mirror的地址
2、mirrorOf等于*的时候覆盖所有repository配置
3、存在多个mirror配置的时候mirrorOf等于*放到最后
4、只配置mirrorOf为central的时候可以不用配置repository
maven mirror 优先级相关推荐
- Maven 仓库优先级
maven仓库优先级:本地仓库(localRepositories) > pom.xml文件中的repositories仓库 > setting.xml配置文件中mirrors镜像仓库 m ...
- maven Mirror镜像
maven Mirror镜像 mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配 ...
- Maven Mirror镜像配置
Maven Mirror镜像 在setting.xml 配置镜像如下: <!--两个可用的mirror站点--><!-- 阿里云的镜像站--><mirror>< ...
- maven mirror repository
简单点来说,repository就是个仓库.maven里有两种仓库,本地仓库和远程仓库.远程仓库相当于公共的仓库,大家都能看到.本地仓库是你本地的一个山寨版,只有你看的到,主要起缓存作用.当你向仓库请 ...
- 配置Maven mirror
文章目录 Maven出现 Maven Cannot resolve plugin xxx 配置文件地址 配置文件元素介绍 Mirror简介 修改配置 Maven出现 Maven Cannot reso ...
- Maven仓库理解和优先级
前言 使用 maven 也有一段时间了,有时候在配置 repository,mirror,profile的时候,总会导致 jar 拉取不到.所以认真的分析了 maven 获取 jar 包时候的优先级. ...
- maven setting.xml 中文配置详解(全配置)
<?xml version="1.0" encoding="UTF-8"?> <!--| 官方文档: https://maven.apache ...
- maven详解之仓库
在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依赖和插件的地方) 任何的 ...
- 史上最详细的maven仓库详解
写在前面: 我是「沸羊羊_」,昵称来自于姓名的缩写 fyy ,之前呕心沥血经营的博客因手残意外注销,现经营此账号. 本人是个小菜,正向着全栈工程师的方向努力着,文章可能并不高产,也很基础,但每写一篇都 ...
最新文章
- 图书管理系统python代码课程设计报告_数据结构图书管理系统课程设计报告
- JS对数据分页的封装方法
- java获得服务器路径的几中方法
- HDU1071_数学几何
- 如何调整标题字体大小_软网推荐:找回调整Windows 10字号功能
- nde升级_NDE新闻编辑室工具KDE Plasma Mobile和更多新闻
- 2019工作榜单|Python程序员吸金榜,AI排第一,这个我服!
- 用RT Server Customizer定制Windows 2008 R2安装光盘
- Frobenius companion matrix
- java winform程序_重拾JAVA之WinForm实战之(四)
- 人人,金山西山居,腾讯互娱,微信,网易游戏offer及面经(转)
- r语言 与python r中python环境的创建
- k3服务器重装系统,金蝶K3安装教程07:K3 WEB系统配置工具
- 更新Win10版本后,wifi图标不见了,并且连接不到wifi和宽带,以及点击网络和Internet闪退的情况
- STC学习:可校准的实时时钟
- 编写php自动脚本,自己编写自动签到脚本
- android手机震动
- 模拟退火算法学习笔记
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(8月4日)...
- 左右植树java_Plant 模拟植树活动,编写一个java应用程序 联合开发网 - pudn.com
热门文章
- 厦门大学计算机专业录取分数线2019,2019年厦门大学各省市各批次录取分数线公布【完整版】...
- MariaDB之SQL语句基础
- Anaconda安装新模块
- zabbix邮件内容乱码与邮件内容为附件解决办法
- spring aop的两种写法aspect和advisor
- 2017.5.3 博客园自动生成章节目录
- VS搭建lua开发环境和LuaBridge注册c++类(cocos2dx项目)(一)
- 今天终于有自己的博客了!!!
- CSS英文单词强制换行
- 学习:MOSS2007 实现单点登陆(转)