Maven实战之Maven仓库
Maven仓库作用
仓库,顾名思义就是存放物品的地方。在Maven中,我们可以将其仓库理解为就是存放jar包的地方,在前面的小节中,我们提到了Maven的中央仓库,该仓库是Maven的默认仓库,基本上包含了常见的Java开源库的jar包及其相关信息。
仓库的路径
在前面的小节中,当需要使用一个依赖的时候,Maven要求我们必须提供其对应的坐标 ( groupId,ArtifactId,version 等信息 ),该信息除了区分不同的依赖外,很重要的一个作用就是标识自己在仓库中对应的存放位置,Maven中仓库的默认存放路径为 GroupId/ArtifactId/version/ArtifactId-version-[classifier].extension,比如spring-core,它的坐标为
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
则其对应的路径为org.springframework/spring-core/4.3.7/spring-core.4.3.7.RELEASE.jar,其中的extension来自于package中的声明,默认为jar
仓库的类型
在Maven中,只有两种类型的仓库:本地仓库、远程仓库,如果进行细分的话,远程仓库还可以进一步划分为:中央仓库、私服、其他公共库。本地仓库以及中央仓库、其他公共仓库的概念显而易见,私服指的是一般公司自己搭建的内部的仓库,不对外开放,同时该仓库可以作为公司内部的公共仓库,并且只由该私服仓库访问其他仓库,这样做可以减少公司的对外带宽,提高效率,同时减少对其他仓库的访问。
配置远程仓库
当Maven在构建的时候,发现本地仓库缺少相对应的构建的时候,就会从远程仓库中查询、获取该构建,由于默认是中央仓库,而有时候中央仓库可能出现网络问题或者我们需要的构建不在中央仓库中,这个时候配置其他远程仓库就很有必要了,配置方式如下:配置pom.xml
<project>
...
<repositories><!--可以配置多个远程仓库-->
<repository><!--配置一个仓库-->
<id>仓库的ID</id><!--ID没有其他要求,但该ID在本文件中应该唯一-->
<name>仓库的名字</name><!--用于开发人员识别--->
<url>仓库的地址</url><!--该地址很重要,是仓库唯一的地址-->
<snapshots><enable>false</enable></snapshots><!--不使用snapshot状态的构建-->
<releases><enable>true</enable></releases><!--使用release状态的构建-->
</repository>
</repositories>
</project>
配置仓库认证信息
有时候,有些远程仓库需要进行身份验证,有时这是很有必要的,如在公司内部,可能有些仓库只允许特定的人员访问,配置方式如下
注意,这里的配置是在setting.xml文件中配置,原因很显然,pom.xml会随着构建的发布提交给其他用户,这是比较危险的做法
<setting>
...
<servers>
<server>
<!--这里的ID要与需要身份认证的仓库中的ID保持一致,这也是为什么仓库中ID需要保持唯一的原因之一-->
<id>仓库的ID</id>
<username>用户名</username>
<password>密码</password>
</server>
</servers>
</setting>
部署至远程仓库
有时候我们可能需要将构建好的构建部署到远程仓库中,供其他开发人员使用,配置的方式如下,pom.xml
<project>
...
<distributionManagement>
<repository>
<!--ID唯一,一般来说需要部署的仓库都需要验证身份,所以还需要配置认证,方式见上面-->
<id>要部署的仓库的ID</id>
<name>仓库的名称</name>
<url>仓库的地址</url>
</repository>
</distributionManagement>
</project>
当代码编写完成,通过测试之后,执行命令mvn clean deploy
就可以将其部署到对应的仓库中,供其他开发者使用。
关于快照版本
需要存在的原因如下
告知其他使用该构建的开发者,该构建属于测试版,不建议在实际生产中使用
方便Maven进行归类管理,方便用户构建时进行选择
仓库解析依赖机制
在Maven中,依赖的解析方式如下:首先是检查本地仓库是否存在、存在则使用,不存在,则向默认的远程仓库或者私服查询,如果有多个的话,先合并所有的远程仓库元信息 groupId/artifactId/maven-metadata.xml文件,然后选择最合适的构建,然后进行解析。
镜像
镜像,顾名思义,就是原来东西的一个复制,Maven仓库的镜像也是如此,如果一个仓库A是另一个仓库B的拷贝,则称仓库A是仓库B的镜像。镜像仓库的可以用于减缓目标仓库的压力,同时,也可以用于修改默认的远程仓库,配置方式如下setting.xml
<setting>
...
<mirrors><!--配置多个镜像仓库-->
<mirror><!--配置一个镜像仓库-->
<id>仓库ID</id>
<name>仓库名称</name>
<url>镜像仓库地址</url>
<!--表示镜像仓库为原仓库的镜像,之后原仓库的访问会直接访问镜像仓库-->
<mirrorof>原仓库地址</mirrorof>
<!--可以使用*表示所有,则所有的访问都会指向镜像仓库-->
</mirror>
</mirrors>
</setting>
仓库搜索服务
有时候我们只知道某一个构建的名称或是组织等一些不足以表示该构建坐标的信息,这个时候有两种主要的解决方案
总结
在这一小节中,我们主要了解了Maven中仓库的概念,仓库的种类,配置远程仓库,配置仓库认证信息,部署构建到远程仓库中,仓库依赖解析机制,镜像仓库,以及几个常用的仓库搜索服务,Maven的学习之路还在继续。