什么是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. python3 Serial 串口助手的接收读取数据

    其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个串口助手,由于我只需要串口能够接收读取数据就可以了,故而这个 ...

  2. pwd

    显示当前在文件系统里的确切位置 注: 系统根目录是/ 用户主目录是/home/用户名 对于root用户,用户主目录为/root

  3. ●BZOJ 2149 拆迁队

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题解: 斜率优化DP,栈维护凸包,LIS,分治(我也不晓得是不是CDQ分治...) 一 ...

  4. Codeforces Round#432 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. Div2A 小判断题 Div2B 小判断题,合法的条件是|AB|=|BC|且三点不共线 Div1A 类比二维.三维空间,可以猜测n太大的时候没 ...

  5. 使用PL/SQL Developer连接远程DB(本机不安装Oracle客户端)

    本文内容亲测可行环境:    服务端:centos6.7 ,oracle 11g r2 ,动态注册,监听端口号:1521    用户端:win7 ,没有安装ORACLE及其客户端 准备文件:plsql ...

  6. 浅谈java中内置的观察者模式与动态代理的实现

    一.关于观察者模式 1.将观察者与被观察者分离开来,当被观察者发生变化时,将通知所有观察者,观察者会根据这些变化做出对应的处理. 2.jdk里已经提供对应的Observer接口(观察者接口)与Obse ...

  7. Python【第二课】 字符串,列表,字典,集合,文件操作

    本篇内容 字符串操作 列表,元组操作 字典操作 集合操作 文件操作 其他 1.字符串操作 1.1 字符串定义 特性:不可修改 字符串是 Python 中最常用的数据类型.我们可以使用引号('或&quo ...

  8. 谷歌发布 TensorFlow Lite [官方网站,文档]

    机器学习社区:http://tensorflow123.com/ 简介 TensorFlow Lite TensorFlow Lite 是 TensorFlow 针对移动和嵌入式设备的轻量级解决方案. ...

  9. 深入以太坊智能合约 ABI

    开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI.本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI ...

  10. easing--缓动函数--贝塞尔函数--圆盘转动抽奖应用

    http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js http://www.robertpenner.com/easing/penn ...