什么是Maven仓库
在Maven世界中,任何一个依赖、插件或项目构建的输出,都可以称为构建。由于Maven引入了坐标机制,任何一个构建都可以由其坐标唯一标识。坐标是一个构建在Maven世界中的逻辑表示方式,而构建的物理表示方式是文件。Maven通过仓库来统一管理这些文件。
在没有Maven的时候,我们管理构建依赖的方法一般是在每一个项目中创建一个lib文件夹,把需要的jar包都放入lib文件夹中。这种方式不好的地方是我们的所有项目中都存在大量相同的jar包。例如:在所有使用Spring框架的项目中都需要依赖spring-core.jar文件,那么在每个项目中都需要放一份spring-core.jar文件。为了避免这种重复,Maven使用仓库来将所有的构建统一的存储起来。实际的Maven项目将不再各自存储其依赖文件,他们只需要声明这些依赖的坐标,在需要的时候,Maven会自动根据坐标找到仓库中的构建,并使用它们。
为了实现重用,项目构建完毕后生成的构建也可以安装或部署到仓库中,供其他项目使用。
Maven仓库的布局
任何一个构建都可以根据坐标唯一标识,在Maven仓库中,构建就是按照坐标的定义存储在指定的路径下的。例如,在本地仓库中,spring-core.jar的存储位置如下图所示:
打开上图目录中的spring-core-2.5.6.pom文件,看到spring-core的maven坐标定义如下图所示:
由此可知:Maven仓库中路径与坐标的大致对应关系为:groupId/artifactId/version/artifactId-version.packaging。Maven仓库的布局是基于简单文件系统存储的。
仓库的分类
Maven仓库分为本地仓库和远程仓库两种。当Maven根据坐标查找构建时,首先会去本地仓库查找,如果本地仓库存在则使用本地仓库中的该构建;如果本地仓库中不存在或者需要使用最新版本的构建时,Maven就会去远程仓库查找需要的构建,并将远程仓库的构建下载至本地仓库,然后再使用本地仓库中已下载的符合要求的构建。如果本地和远程仓库都没有需要的构建,则Maven会报构建失败错误。
本地仓库即用户机器中基于Maven仓库布局存储构建的目录。而远程仓库还可以分为*仓库、私服和其他远程仓库三种。*仓库是Maven自带的默认的远程仓库,当本地没有需要的构建时,就会自动去*仓库下载。私服是一种特殊的远程仓库,是由用户在局域网中架设的一个私有的仓库服务器,用于代理所有外部的远程仓库。另外,用户自己的项目也可以部署至私服中,供其他的项目下载和使用。私服可以节省带宽、提高构建速度、便于内部项目的共享等。
仓库分类如下图所示:
本地仓库
Maven项目中不再使用lib文件夹管理依赖的构建,当项目构建时,Maven将根据坐标去本地仓库中查找依赖的构建并使用。Maven默认的本地仓库的地址为:用户目录\.m2\repository。如本人的本地仓库目录为:C:\Users\benma\.m2\repository。如果我们想要修改本地仓库的地址,可以在\.m2目录下创建一个settings.xml文件,该文件可以从Maven的安装目录的conf目录下拷贝一份。然后设置settings.xml文件中的localrepository参数即可。如下图所示,即将本地仓库的地址设置为:D:\java\apache-maven\repository
Maven在进行项目构建时,会首先去本地仓库查找需要的构建,如果存在则使用,如果不存在或需要下载最新版本则会去远程仓库下载需要的版本至本地仓库后使用。需要说明的是,当我们安装好Maven后,本地仓库中是没有文件的,只有在执行项目构建时需要某个构建,本地仓库才会从远程仓库下载构建至本地仓库中。本地仓库增加构建有两种情况:①执行构建时本地仓库没有所需的构建,从远程仓库下载构建至本地仓库;②执行install命令将本地构建的内部项目部署至本地仓库中。
关于Maven的install命令及构建,请参考本人的另一篇博客:Maven生命周期详解 。
远程仓库
远程仓库就是本地仓库下载构建的仓库。每一个用户的本地仓库只有一个,但是可以配置一个或多个远程仓库。
*仓库
*仓库为Maven默认的远程仓库,Maven默认的远程仓库的配置在:Maven安装目录/lib/maven-model-builder-3.1.0.jar/org/apache/maven/model/pom-4.0.0.xml文件中(本人介绍的是Maven3,使用的是3.1.0版本。Maven2中配置与Maven3不同)。该pom文件为Maven的超级pom,任何pom工程都会继承该超级pom。该pom中远程仓库的配置如下图所示:
上图中在project元素下,使用repositories下的repository元素配置远程仓库。id为central,这是Maven*仓库的唯一标识,如果需要配置其他远程仓库不能与该id相同。url为该远程仓库的地址。layout为default是该远程仓库的布局方式,default方式即为上面所说的基于坐标的简单文件存储布局方式:groupId/artifactId/version/artifactId-version.packaging。再往下面snapshots的enabled为false代表不能从该远程仓库下载快照版本。关于快照版本,下面会有详细的讲解。
私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网的Maven用户使用。当Maven需要下载构建时,首先从私服请求,如果私服上不存在该构建,则从外部的远程仓库下载,存储在私服上之后,再为Maven用户的下载请求提供服务。此外,一些无法从外部仓库下载的构建也能从本地上传至私服上供Maven用户使用。
Maven私服有以下好处:
-
节省外网带宽
之前所有的Maven用户下载构建都需要取外网的远程仓库,使用私服之后,对于已经下载到私服的构建直接就可以下载;而且只要有一个人下载了改构建,私服中就存储了该构建,其他人下载该构建时就不需要再次去外网了。 -
加速Maven构建
私服的存在使得Maven构建时访问外网的次数大大减少,提高了构建速度。 -
部署第三方构建
一些无法从外部仓库下载的构建也能从本地上传至私服上供Maven用户使用。 -
提高稳定性,增强控制
私服的存在可以减少Maven对网络的依赖,提高了稳定性。一些私服软件(如Nexus)还提供了很多管理的功能,如权限管理、Release/Snapshot版本区分等,管理员可以对仓库进行一些更高级的控制。
建立私服是用好Maven的关键之一。请参考大神徐晓斌的博客文章:Nexus入门指南(图文)
关于远程仓库的配置等知识,请参考大神徐晓斌的博客文章:Maven最佳实践:Maven仓库
声明:本篇博客是本人学习了徐晓斌的《Maven 3 in Action》有关仓库的章节后的学习笔记以及本人在使用Maven的过程中对仓库的一些理解。仅用于学习交流。