Maven核心概念介绍

一、仓库

在 Maven 的术语中,仓库是一个位置(place)。
Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
以下是Maven中仓库的概念及关系
在这里插入图片描述

1、本地仓库

放在本地磁盘的maven仓库
maven 的本地仓库,在安装 maven 后并不会创建,是在第一次执行 maven 命令的时候才被创建
maven本地仓库默认位置:无论是 Windows 还是 Linux ,在用户的目录下都有一个 .m2/repository/的仓库目录,如何更改 maven 默认的本地仓库位置?在maven 的 settings.xml 文件中使用 标签进行配置

1.	<localRepository>D:\localrepo</localRepository>

此时,maven 的本地仓库地址就会变成自己配置的地址,注:此时配置的 maven 的本地仓库是属于用户范围的。一般情况下不推荐全局范围的本地仓库,用户范围的本地仓库就可以了。

2、远程仓库

远程仓库可以分为中央仓库和私服
中央仓库
maven默认中央仓库:
• 默认maven中央仓库
• 默认maven中央仓库的搜索页面
中央仓库由maven社区管理,包含了大量常用的库,流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。
所有的 maven 项目都会继承超级pom,超级pom结构如下:

1.	<repositories>  
2.	    <repository>  
3.	      <id>central</id>  
4.	      <name>Central Repository</name>  
5.	      <url>http://repo.maven.apache.org/maven2</url>  
6.	      <layout>default</layout>  
7.	      <snapshots>  
8.	        <enabled>false</enabled>  
9.	      </snapshots>  
10.	    </repository>  
11.	</repositories>

特点:
• 仓库由maven社区管理
• 不需要配置
• 需要网络才能访问
• 国内下载速度慢
远程仓库配置
由于默认的官方 maven 仓库在国内下载速度太慢,好在有一些镜像仓库,下载速度会快很多!在平时的开发中,我们往往不会使用默认的中央仓库,不仅是速度慢,可能项目的某些构件中央仓库是没有的,而其他远程仓库中有,如最常用的是 阿里云仓库。

1.	<!-- 阿里云仓库 -->
2.	<mirrors>
3.	    <mirror>
4.	       <id>alimaven</id>
5.	       <mirrorOf>central</mirrorOf>
6.	       <name>aliyun maven</name>
7.	       <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
8.	    </mirror>
9.	</mirrors>
10.	
11.	<!-- 私服 -->
12.	<mirrors>
13.	    <mirror>
14.	        <id>nexus</id>
15.	        <mirrorOf>central</mirrorOf>
16.	        <name>nexus repository</name>
17.	        <url>http://nexus.dmsd.tech/nexus/content/groups/dynamic-public</url>
18.	    </mirror> 
19.	</mirrors>
20.	
21.	<profile>
22.	<id>central</id>
23.	    <repositories>
24.	        <repository>
25.	            <id>central</id>
26.	            <name>Central</name>
27.	            <url>http://nexus.dmsd.tech/nexus/content/groups/dynamic-public </url>
28.	        </repository>
29.	    </repositories>
30.	</profile>

mirrors 与 respository
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能从它的镜像中获取。例如:
http://repo1.maven.org/maven2/ 是中央仓库,
http://maven.oschina.net/content/groups/public/ 是其在中国的镜像,由于地理位置的因素,该镜像往往能提供比中央仓库更快的服务。因此,可以配置 maven 使用该镜像来替代中央仓库。

1.	<mirrors>
2.	     <mirror>
3.	       <id>maven.oschina.net</id>
4.	       <name>maven mirror in China</name>
5.	      <url>http://maven.oschina.net/content/groups/public/</url>
6.	       <mirrorOf>central</mirrorOf>
7.	    </mirror>
8.	</mirrors>

其中,mirrorOf的值是 central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,
用户也可以使用同样的方法配置其他仓库的镜像,id 表示镜像的唯一标识符,name 表示镜像的名称,url 表示镜像的地址。
关于镜像的一个更为常见的用法是结合私服,由于私服可以代理任何外部的远程仓库(包括中央仓库),因此,对于组织内部的maven用户来说使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化maven本身的配置。
私服
私服是一种特殊的远程仓库,是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 maven 用户使用。当 maven 需要下载构件的时候,会从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上后,再为 maven 的下载请求提供服务。
maven私服特性
• 节省外网宽带,:减少重复请求造成的外网带宽消耗
• 加速 maven 构件:如项目中配置很多外部远程仓库时,构建速度会大大降低
• 部署第三方构件:有些构件无法从外部仓库获得时,可以把这些构件部署到内部仓库(私服)中,供
内部 maven 项目使用
• 提高稳定性,增强控制:Internet 不稳定时,maven 构建也会很不稳定
• 降低中央仓库的负荷:maven 中央仓库被请求的数量是巨大的,配置私服可以大大降低中央仓库的压力
主流的maven私服
• Apache 的 Archiva
• JForg 的 Artifactory
• Sonatype 的 Nexus
在这种情况下,任何需要的构件都可以从私服中获得,私服就是所有仓库的镜像,这时,可以这样配置:

1.	<!--配置私服镜像-->
2.	 <mirrors> 
3.	     <mirror>  
4.	         <id>nexus</id>  
5.	         <name>internal nexus repository</name>  
6.	         <url>http://10.2.2.56:8081/nexus/content/groups/public/</url>  
7.	        <mirrorOf>*</mirrorOf>  
8.	   </mirror>  
9.	</mirrors>

该例中的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至局域网的 url地址,如果该镜像需要认证,则配置一个 id 为 nexus 的认证信息即可。
如果 repositories 的 id 和 mirror 的 mirrorOf 的值相同,则该mirror 替代该 repository.
如果该 repository 找不到对应的 mirror,则使用其本身,所以起到最终作用的是 repository 集合,repositories 中默认
包含了中央仓库 central,当然也可以重写URL
mirror相当于一个拦截器,它会拦截 maven 对 repository 的相关请求,把请求里的 remote repository 地址,重定向到mirror 里配置的地址。

3、Maven依赖搜索顺序

Maven 多仓库查询依赖的顺序大致如下:
• 在本地仓库寻找,如果没有则进入下一步
• 在全局配置的私服仓库 (settings.xml) 中寻找,如果没有则下一步
• 在项目自身配置的私服仓库 (pom.xml) 中寻找,如没有则下一步
• 在中央仓库中寻找,如果没有则终止寻找
在这里插入图片描述

注:
• 如果在找寻的过程中,如果发现该仓库有镜像设置,则用镜像的地址代替,例如现在进行到要在respository A仓库中查找某个依赖,但A仓库配置了mirror,则会转到从A的mirror中查找该依赖,不会再从A中查找。
• settings.xml中配置的profile(激活的)下的respository优先级高于项目中pom文件配置的respository。
• 如果仓库的id设置成“central”,则该仓库会覆盖maven默认的中央仓库配置。

二、坐标

Maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组Maven坐标是通过一些元素定义的,他们是groupId、artifactId、version、packaging、classifier。先看一组坐标定义,如下:

1.	<groupId>org.sonatype.nexus</groupId>
2.	<artifactId>nexus-indexer</artifactId>
3.	<version>2.0.0</version>
4.	<packaging>jar</packaging>

这是nexus-indexer的坐标定义,nexus-indexer是一个对Maven仓库编篡索引并提供搜索的类库,他是Nexus项目的一个子模块。上述代码片段中,其坐标分别为groupId:org.sonatype.nexus、artifactId:nexus-indexer、version:2.0.0.、packaging:jar,没有classifier。下面详细解释一下各个坐标元素。
1、groupId
定义当前Maven项目隶属的实际项目。首先,Maven项目和实际项目不一定是一对一的关系。比如SpringFramework这一实际项目,其对应的Maven项目会有很多,如spring-core、spring-context等。这是由于Maven中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多实际项目,如果groupId只定义到组织级别,而后面我们会看到,artifactId只能定义Maven项目(模块),那么实际项目这个层将难以定义。最后,groupId的表示方式与Java包名的表示方法类似,通常与域名反向一一对应。上例中,groupId为org.sonatype.nexus,org.sonatype表示Sonatype公司建立的一个非营利性组织,nexus表示Nexus这一实际项目,该groupId与域名nexus.sonatype.org对应。
2、artifactId
该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。比如上例中的artifactId是nexus-indexer,使用了实际项目名nexus作为前缀,这样做的好处是方便寻找实际构件。在默认情况下,Maven生成的构件,其文件名会以artifactId作为开头,如nexus-indexer-2.0.0.jar,使用实际项目名称作为前缀之后,就能方便从一个lib文件夹中找到某个项目的一组构件。考虑有5个项目,每个项目都有一个core模块,如果没有前缀,我们会看到很多core-1.2.jar这样的文件,加上实际项目名前缀之后,便能很容易区分foo-core-1.2.jar、bar-core-1.2.jar……
3、version
该元素定义Maven项目当前所处的版本,如上例中nexus-indexer的版本是2.0.0。需要注意的是,Maven定义了一套完成的版本规范,以及快照(SNAPSHOT)的概念。
4、packaging
该元素定义Maven项目的打包方式。首先,打包方式通常与所生成构件的文件扩展名对应,如上例中packaging为jar,最终的文件名为nexus-indexer-2.0.0.jar,而使用war打包方式的Maven项目,最终生成的构件会有一个.war文件,不过这不是绝对的。其次,打包方式会影响到构建的生命周期,比如jar打包和war打包会使用不同的命令。最后,当不定义packaging的时候,Maven会使用默认值jar。
5、classifier
该元素用来帮助定义构建输出的一些附属构建。附属构件与主构件对应,如上例中的主构件是nexus-indexer-2.0.0.jar,该项目可能还会通过使用一些插件生成如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar这样一些附属构建,其包含了Java文档和源代码。这时候,javadoc和sources就是这两个附属构建的classifier。这样,附属构建也就拥有了自己唯一的坐标。还有一个关于classifier的典型例子是TestNG,TestNG的主构件是基于Java1.4平台的,而他又提供了一个classifier为jdk5的附属构件。注意,不能直接定义项目的classifier,因为附属构建不是项目直接默认生成地,而是由附加的插件帮助生成。
上述5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的。
同时,项目构建的文件名和坐标相对应的,一般的规则为artifactId-version [-classifier] .packaging,[-classifier]表示可选。比如上例nexus-indexer的主构件为nexus-indexer-2.0.0.jar,附属构建有nexus-indexer-2.0.0-javaodc.jar。这里还要强调一点是,packaging 并非一定与构件扩展名对应,比如packaging为maven-plugin的构件扩展名为jar。
此外,Maven仓库的布局也是基于Maven坐标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值