写在前面:
我是「沸羊羊_」,昵称来自于姓名的缩写 fyy ,之前呕心沥血经营的博客因手残意外注销,现经营此账号。
本人是个小菜,正向着全栈工程师的方向努力着,文章可能并不高产,也很基础,但每写一篇都在用心总结,请大佬勿喷。
如果您对编程有兴趣,请关注我的动态,一起学习研究。
感谢每位读者!
在 Maven 的术语中,仓库是一个位置(place)。
Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
1、基于 groupId 准备路径,将点分隔符转换成路径分隔符,就是将 “.” 转换成 “/”;例如:org.mybatis --> org/mybatis
2、基于 artifactId 准备路径,将 aftifactId 连接到 groupId 后面,org/mybatis/mybatis-spring
3、基于version 准备路径,将 version 连接到 artifactId 后面,org/mybatis/mybatis-spring/2.0.2
4、连接 artifactId 和 version 以分隔符分隔,org/mybatis/mybatis-spring/2.0.2/mybatis-spring-2.0.2
5、判断如果构件有 classifier,就要在第4项后增加分隔连字号 再加上 classifer,org/mybatis/mybatis-spring/2.0.2/mybatis-spring-2.0.2/mybatis-spring-2.0.2-jdk8
6、检查构件的 extension,如果 extension 存在,则加上句点分隔符和extension,而 extension 是由 packing 决定的,
org/mybatis/mybatis-spring/2.0.2/mybatis-spring-2.0.2/mybatis-spring-2.0.2-jdk8.jar
TIPS
classifier可以是任意的字符串,用于拼接在 gav 之后来确定指定的文件,可用来区分不同jdk版本生成的 jar包。当使用gav出错时,可以查看一下仓库中的jar路径,查看 jar 是否是按 jdk 版本进行划分导致找不到依赖,如果是,在pom中对应的依赖节点gav后添加 classifier 标签。
maven仓库类型
顾名思义,存放在本地磁盘的maven仓库
maven 的本地仓库,在安装 maven 后并不会创建,是在第一次执行 maven 命令的时候才被创建
maven本地仓库默认位置:无论是 Windows 还是 Linux ,在用户的目录下都有一个 .m2/repository/的仓库目录,如何更改 maven 默认的本地仓库位置?在maven 的 settings.xml 文件中使用
此时,maven 的本地仓库地址就会变成自己配置的地址,注:此时配置的 maven 的本地仓库是属于用户范围的。一般情况下不推荐全局范围的本地仓库,用户范围的本地仓库就可以了。
私服是一种特殊的远程仓库,是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 maven 用户使用。当 maven 需要下载构件的时候,会从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上后,再为 maven 的下载请求提供服务。
maven私服特性
主流的maven私服
maven默认中央仓库:
中央仓库由maven社区管理,包含了大量常用的库,流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。
所有的 maven 项目都会继承超级pom
,超级pom
结构如下:
<repositories>
<repository>
<id>centralid>
<name>Central Repositoryname>
<url>http://repo.maven.apache.org/maven2url>
<layout>defaultlayout>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
特点:
由于默认的官方 maven 仓库在国内下载速度太慢,好在有一些镜像仓库,下载速度会快很多!在平时的开发中,我们往往不会使用默认的中央仓库,不仅是速度慢,可能项目的某些构件中央仓库是没有的,而其他远程仓库中有,如最常用的是 阿里云仓库。
<mirrors>
<mirror>
<id>alimavenid>
<mirrorOf>centralmirrorOf>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/repositories/central/url>
mirror>
mirrors>
<mirrors>
<mirror>
<id>nexusid>
<mirrorOf>centralmirrorOf>
<name>nexus repositoryname>
<url>http://nexus.dmsd.tech/nexus/content/groups/dynamic-publicurl>
mirror>
mirrors>
<profile>
<id>centralid>
<repositories>
<repository>
<id>centralid>
<name>Centralname>
<url>http://nexus.dmsd.tech/nexus/content/groups/dynamic-public url>
repository>
repositories>
profile>
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能从它的镜像中获取。例如:
http://repo1.maven.org/maven2/ 是中央仓库,
http://maven.oschina.net/content/groups/public/ 是其在中国的镜像,
由于地理位置的因素,该镜像往往能提供比中央仓库更快的服务。因此,可以配置 maven 使用该镜像来替代中央仓库。
<mirrors>
<mirror>
<id>maven.oschina.netid>
<name>maven mirror in Chinaname>
<url>http://maven.oschina.net/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
其中,mirrorOf的值是 central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,
用户也可以使用同样的方法配置其他仓库的镜像,id 表示镜像的唯一标识符,name 表示镜像的名称,url 表示镜像的地址。
关于镜像的一个更为常见的用法是结合私服,由于私服可以代理任何外部的远程仓库(包括中央仓库),因此,对于组织内部的maven用户来说
使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化maven本身的配置。在这种情况下,
任何需要的构件都可以从私服中获得,私服就是所有仓库的镜像,这时,可以这样配置:
<mirrors>
<mirror>
<id>nexusid>
<name>internal nexus repositoryname>
<url>http://183.238.2.182:8081/nexus/content/groups/public/url>
<mirrorOf>*mirrorOf>
mirror>
mirrors>
该例中<mirrorOf>的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至局域网的 url地址,如果该镜像
需要认证,则配置一个 id 为 nexus 的认证信息即可。
如果 repositories 的 id 和 mirror 的 mirrorOf 的值相同,则该mirror 替代该 repository.
如果该 repository 找不到对应的 mirror,则使用其本身,所以起到最终作用的是 repository 集合,repositories 中默认
包含了中央仓库 central,当然也可以重写URL
mirror相当于一个拦截器,它会拦截 maven 对 repository 的相关请求,把请求里的 remote repository 地址,重定向到
mirror 里配置的地址。
maven 多仓库查询依赖的顺序大致如下:
1、如果在找寻的过程中,如果发现该仓库有镜像设置,则用镜像的地址代替,例如现在进行到要在respository A仓库中查找某个依赖,但A仓库配置了mirror,则会转到从A的mirror中查找该依赖,不会再从A中查找。
2、settings.xml中配置的profile(激活的)下的respository优先级高于项目中pom文件配置的respository。
3、如果仓库的id设置成“central”,则该仓库会覆盖maven默认的中央仓库配置。