Maven仓库概述
什么是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仓库概述的更多相关文章
- 转:aliyun阿里云Maven仓库地址——加速你的maven构建
maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...
- aliyun阿里云Maven仓库地址——加速你的maven构建
maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...
- maven仓库信息分析站点推荐
maven是java的一个依赖,打包管理的工具,稍微大一点的java项目都需要使用maven. 随着java的壮大,maven仓库越来越大,仓库中的jar包有60多万,各种group,各种构件,各种版 ...
- 国内好用的maven仓库,添加到本地nexus中
速度快的maven仓库真的难找,国外网站很多被封了.前天在网上找,有人说阿里有个公开的,速度很快.确实很快! 我添加到本地nexus中,结果不能更新索引,我是这么添加的,如下: 这个地址在浏览器中能够 ...
- Maven最佳实践:Maven仓库(转)
转自:http://juvenshun.iteye.com/blog/359256 什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/li ...
- maven仓库使用
maven镜像仓库 1.国内maven镜像仓库 阿里云镜像 <mirrors> <mirror> <id>aliyun</id> <name> ...
- maven 仓库地址:
maven 仓库地址: 共有的仓库 http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/ http://repositor ...
- 配置maven仓库
1.安装完,配置好环境变量 mvn -v 检查是否成功 mvn install 会将项目生成的构件安装到本地maven仓库 2.settings.xml文件配置: 1)修改本地仓库位置 maven_h ...
- 收集的maven 仓库地址(maven repository)
maven 仓库地址: 共有的仓库http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/http://repository. ...
随机推荐
- [LeetCode] Top K Frequent Words 前K个高频词
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- [NOIp 2009]Hankson的趣味题
Description Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课 ...
- [HNOI2016]最小公倍数
题目描述 给定一张N个顶点M条边的无向图(顶点编号为1,2,...,n),每条边上带有权值.所有权值都可以分解成2a∗3b2^a*3^b2a∗3b 的形式. 现在有q个询问,每次询问给定四个参数u.v ...
- bzoj 4545: DQS的trie
Description DQS的自家阳台上种着一棵颗粒饱满.颜色纯正的trie. DQS的trie非常的奇特,它初始有n0个节点,n0-1条边,每条边上有一个字符.并且,它拥有极强的生长力:某个i时刻 ...
- bzoj 3930: [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- linux 下文件误删恢复
linux 下文件误删恢复 0x01 事件背景 某天晚上写代码的时候,本来想删除当前目录下一个叫xxx的文件夹 rm -rdf ./xxx/*, 结果光顾着和人说话,一不留神手贱把命令敲成了rm -r ...
- java的泛型
泛型概述 先看下面的代码: ArrayList al1 = new ArrayList(); ArrayList al2 = new ArrayList(); al1.add("hello& ...
- solr6.6初探之主从同步
1.关于solr索引数据同步 通常情况下,单节点部署的solr应用很难在并发量很大的情况下"久存",那么多节点部署提高Solr应用的负载量和响应时间势在必行. solr索引同步有以 ...
- Python Socket第二篇(socketserver)
本节内容 socketserver基础知识 ThreadingTCPServer源码剖析 1.socketserver基础 ThreadingTCPServer实现的Soket服务器内部会为每个cli ...
- C语言 字符串 字符串处理操作 字符串与函数
字符数组的定义和初始化 宏常量+1 强调了字符串的最大强度 推荐忽略长度的定义 不能对所指向的存储单元内容修改,除非是字符串数组的定义 因为指针变量指向的是字符串数组的值,可以被修改. 未初始化 字 ...