什么是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的过程中对仓库的一些理解。仅用于学习交流。

Maven仓库概述的更多相关文章

  1. 转:aliyun阿里云Maven仓库地址——加速你的maven构建

    maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...

  2. aliyun阿里云Maven仓库地址——加速你的maven构建

    maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...

  3. maven仓库信息分析站点推荐

    maven是java的一个依赖,打包管理的工具,稍微大一点的java项目都需要使用maven. 随着java的壮大,maven仓库越来越大,仓库中的jar包有60多万,各种group,各种构件,各种版 ...

  4. 国内好用的maven仓库,添加到本地nexus中

    速度快的maven仓库真的难找,国外网站很多被封了.前天在网上找,有人说阿里有个公开的,速度很快.确实很快! 我添加到本地nexus中,结果不能更新索引,我是这么添加的,如下: 这个地址在浏览器中能够 ...

  5. Maven最佳实践:Maven仓库(转)

    转自:http://juvenshun.iteye.com/blog/359256 什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/li ...

  6. maven仓库使用

    maven镜像仓库 1.国内maven镜像仓库 阿里云镜像 <mirrors> <mirror> <id>aliyun</id> <name> ...

  7. maven 仓库地址:

    maven 仓库地址: 共有的仓库 http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/ http://repositor ...

  8. 配置maven仓库

    1.安装完,配置好环境变量 mvn -v 检查是否成功 mvn install 会将项目生成的构件安装到本地maven仓库 2.settings.xml文件配置: 1)修改本地仓库位置 maven_h ...

  9. 收集的maven 仓库地址(maven repository)

    maven 仓库地址: 共有的仓库http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/http://repository. ...

随机推荐

  1. [MongoDB教程] 1.简介

    MongoDB (名称来自「humongous (巨大无比的)」), 是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于 分布式 文件存储,由 C++ 语言编写,设计之初旨在为 WEB ...

  2. Asp.net Core2.0 缓存 MemoryCache 和 Redis

    自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...

  3. [LeetCode] Reverse Words in a String III 翻转字符串中的单词之三

    Given a string, you need to reverse the order of characters in each word within a sentence while sti ...

  4. Python数据抓取_BeautifulSoup模块的使用

    在数据抓取的过程中,我们往往都需要对数据进行处理 本篇文章我们主要来介绍python的HTML和XML的分析库 BeautifulSoup 的官方文档网站如下 https://www.crummy.c ...

  5. OC/Swift/C/C++混合使用的编程姿势

    一,OC调用C语言方法 1.OC中的.m文件对C语言完全兼容,可以直接导入C头文件,进行使用 2.定义一个.c的C语言文件,在.m文件中导入,就可以使用.   二,OC调用C++语言方法 1.需要将. ...

  6. [SCOI2008]天平

    题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...

  7. hdu 4630 查询[L,R]区间内任意两个数的最大公约数

    No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. bzoj3437小P的牧场 斜率优化dp

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1542  Solved: 849[Submit][Status][Discus ...

  9. Android 自定义支持快速搜索筛选的选择控件(一)

    Android 自定义支持快速搜索筛选的选择控件 项目中遇到选择控件选项过多,需要快速查找匹配的情况. 做了简单的Demo,效果图如下: 源码地址:https://github.com/whieenz ...

  10. 如何成为快手尬舞王?HUAWEI HiAI了解一下!

    左手!右手!抱一抱!扭一扭! 快手短视频,红遍东西南北中, 给大家的生活增添了不少乐趣. 有了人体姿态识别的魔法表情, 不会跳舞的也都可以跟着跳一跳. 从村口朴实的阿姨,到写字楼里端庄的白领, 在人体 ...