(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/83549846冷血之心的博客)

快速导航:

Maven基础概念和安装配置教程

Maven的仓库和settings.xml配置文件

Maven的坐标与依赖

Maven的生命周期和插件

Maven的聚合与继承

目录

Maven的仓库

本地仓库

远程仓库

私服

中央仓库

settings.xml配置文件

总结


在Maven基础概念和安装配置一文中,我们简单学习了Maven是什么,安装包里边的各个文件夹都存放着哪些东西,并且进行了简单的安装配置。在本文中,我们将进一步学习了解何为Maven仓库以及Maven的配置文件settings.xml如何配置。

Maven的仓库

Maven用来存储依赖和插件的一个统一的地方,称之为仓库,Maven仓库又分为本地仓库和远程仓库。远程仓库又分为私服和中央仓库等。

我们以一幅图来表示它们的关系:

本地仓库

就是maven在本地(我们的计算机上)存储构件(依赖的Jar包等)的仓库,默认是在用户的.m2/repository/目录下。需要注意的是刚开始在.m2/下边是没有这个repository/文件夹的,当我们在命令行中运行mvn命令后才会出现该文件夹,并且在该文件夹下存储我们从远程仓库下载的构件。

既然Maven默认在/.m2/repository/下存储依赖和构件,那么我们是不是可以改变自定义这个位置?

答案是肯定的,注意看图中的/.m2/settings.xml 该文件是maven的配置文件,我们可以在该文件中通过标签<localRepository></localRepository>来配置本地仓库的位置。(settings.xml文件是啥?其作用是啥?我们需要如何配置将在下边详细讲解)

远程仓库

远程仓库又分为中央仓库私服以及其它公共库,我们也借用一幅图来阐述它们之间的关系。

由图中可以看出,我们Maven用户是在和私服打交道,包括上传和下载构件,当私服满足不了我们的下载构件需求时,私服会和中央仓库或者其余公共仓库交互,将用户需要的构件缓存在私服仓库中。那么何为私服?

私服

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。

局域网使用搭建maven私服的好处

1.节省外网带宽:减少重复请求造成的外网带宽消耗,将大部分构件缓存在私服,用户和私服的交互走局域网。

2.加速Maven构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低,因为外网下载速度很慢。

3.部署第三方构件:有些构件无法从外部仓库获得的时候,可以把这些构件部署到内部仓库(私服)中,供内部maven项目使用。

4.提高稳定性:避免当外网不稳定的时候,maven构建也变的不稳定的情况。

5.增强控制:在公司内部可以访问私服可以通过配置用户名和密码来增强权限控制。

5.降低中央仓库的负荷:maven中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力

中央仓库

Maven提供了一个中央仓库,其地址为:http://repo.maven.apache.org/maven2 ,该仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。据统计,每个月中央仓库大概会接受全世界Java程序员大概1亿次访问,其重要性不言而喻。

在上一节Maven基础概念和安装配置教程 中,我们提到了maven的超级pom也是一种约定,所有的maven项目的pom文件都继承于该超级pom。(超级pom文件位于你的安装目录/apache-maven-3.2.5/lib/maven-model-builder-3.2.5.jar包中,并且在org/apache/maven/model/pom-4.0.0.xml路径下)在超级Pom中,对于中央仓库进行了配置,如下所示:

注意看该配置中的标签<snapshots></snapshots>,该标签设置为false,表示我们不从该仓库中获取不稳定的SNAPSHOT版本的构件;其实还有一个<releases></releases>标签,表示我们是否从该仓库中获取稳定版本的构件;

一段比较完整的远程仓库的配置如下:


  1. <repositories>
  2. <repository>
  3. <id>jboss</id>
  4. <name>JBoss Repository</name>
  5. <url>http://repository.jboss.com/maven2/</url>
  6. <releases>
  7. <updatePolicy>daily</updatePolicy><!-- never,always,interval n -->
  8. <enabled>true</enabled>
  9. <checksumPolicy>warn</checksumPolicy><!-- fail,ignore -->
  10. </releases>
  11. <snapshots>
  12. <enabled>false</enabled>
  13. </snapshots>
  14. <layout>default</layout>
  15. </repository>
  16. </repositories>

<updatePolicy></updatePolicy>标签:表示Maven从远程仓库检查更新的频率, 默认值是daily ,表示每天都检查一次;never-从不检查;always-每次构建都检查更新;interval n-每隔n分支检查一次更新。

<checksumPolicy></checksumPolicy>标签:表示maven检查和检验文件的策略,warn为默认值,还可以选择ignore和fail,表示当maven检查检验和文件失败之后应该采取的行动。

既然我们配置了远程仓库,那么是不是也需要在某个地方进行远程仓库的权限认证?否则谁都可以下载上传构件岂不是一件很麻烦的事?

答案当然也是肯定的,我们需要远程仓库的权限认证。我们可以在settings.xml配置文件中配置<servers></servers>来搞定


  1. <servers>
  2. <server>
  3. <id>archiva.internal</id> // release版本的用户名和密码
  4. <username>admin</username>
  5. <password>pwdpwd</password>
  6. </server>
  7. <server>
  8. <id>archiva.snapshots</id> // snapshot版本的用户名和密码
  9. <username>admin</username>
  10. <password>pwdpwd</password>
  11. </server>
  12. </servers>

需要注意的是:这里的<id>archiva.snapshots</id>必须与POM中需要认证的repository元素的Id一致,这样maven才能知道我们的用户名和密码是在认证哪个仓库。

配置了远程仓库并且进行了仓库的权限认证,maven已经可以帮助我们自动下载所需的构件了,当我们准备把自己的构件上传到远程仓库供别人使用时,我们还需要使用<distributionManagement></distributionManagement>来搞定。


  1. <distributionManagement>
  2. <repository>
  3. <id>archiva.internal</id>
  4. <name>Internal Release Repository</name>
  5. <url>http://nexus.d.xxx.net/nexus/content/repositories/releases/</url>
  6. </repository>
  7. <snapshotRepository>
  8. <id>archiva.snapshots</id>
  9. <name>Internal Snapshot Repository</name>
  10. <url>http://nexus.d.xxx.net/nexus/content/repositories/snapshots/</url>
  11. </snapshotRepository>
  12. </distributionManagement>

配置了之后,我们可以通过mvn deploy将本地的构件发布到远程仓库中。

settings.xml配置文件

当我们下载安装好Maven时,在其安装目录的conf下存在一个settings.xml的配置文件,这是一个全局的maven配置文件,为了不影响这台计算机上的其他用户,一般选择将该文件copy到 ~/.m2/下边,作为一个用户层面的配置文件。

settings.xml文件中主要包含以下的元素:

localRepository本地仓库的目录。默认是用户目录下面的.m2/repository目录。

interactiveMode:表示是否使用交互模式,默认是true;如果设为false,那么当Maven需要用户进行输入的时候,它会使用一个默认值。

offline:表示是否离线,默认是false。这个属性表示在Maven进行项目编译和部署等操作时是否允许Maven进行联网来下载所需要的信息。

mirrors定义一系列的远程仓库的镜像,用于缓解远程仓库的压力。

profiles用于指定一系列的profile。

activeProfiles:指定当前正在活跃的profile。

servers表示当需要连接到一个远程服务器的时候需要使用到的验证方式。

接下来我们给出一个settings.xml的简单的配置文件示例:


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings>
  3. <mirrors>
  4. <mirror>
  5. <!--This sends everything else to /public -->
  6. <id>nexus</id> // 镜像id
  7. <mirrorOf>*</mirrorOf> // 表示代理所有仓库
  8. <url>http://nexus.d.xxx.net/nexus/content/groups/public</url> // 该镜像的地址
  9. </mirror>
  10. </mirrors>
  11. <profiles>
  12. <profile>
  13. <id>development</id>
  14. <repositories> // 构件的仓库
  15. <repository>
  16. <id>central</id>
  17. <url>http://nexus</url>
  18. <releases><enabled>true</enabled></releases>
  19. <snapshots><enabled>true</enabled></snapshots>
  20. </repository>
  21. </repositories>
  22. <pluginRepositories> // 插件的仓库
  23. <pluginRepository>
  24. <id>central</id>
  25. <url>http://nexus</url>
  26. <releases><enabled>true</enabled></releases>
  27. <snapshots><enabled>true</enabled></snapshots>
  28. </pluginRepository>
  29. </pluginRepositories>
  30. </profile>
  31. </profiles>
  32. <activeProfiles>
  33. <activeProfile>development</activeProfile> // 对于所有的pom,上边定义的id=development的profile都是活跃状态的
  34. </activeProfiles>
  35. <servers>
  36. <server>
  37. <id>archiva.internal</id> // release版本的用户名和密码
  38. <username>yangwenqiang</username>
  39. <password>pwdpwd</password>
  40. </server>
  41. <server>
  42. <id>archiva.snapshots</id> // snapshot版本的用户名和密码
  43. <username>yangwenqiang</username>
  44. <password>pwdpwd</password>
  45. </server>
  46. </servers>
  47. </settings>

下边我们重点说两个比较有用的配置:

<mirrors></mirrors>:镜像,如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。说白了,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。在上边的示例中,我们使用<url></url>中配置的http://nexus.d.xxx.net/nexus/content/groups/public来代理所有的远程仓库,其实这个代理一般情况下是你们公司的内网搭建的私服,在局域网内,加快访问速度等作用。

profiles: 可以配置构件和插件的远程仓库,并且可以通过<id>来配置多个profile,最后通过<activeProfiles>来指定当前处于活跃状态(即有效的)的profile配置是哪一个。

总结

这篇文章我们简单了解了maven的仓库,以及如何配置远程仓库,包括私服镜像和远程仓库的认证等知识点。当我们真正入职某一家公司的时候,我想很重要的一件事就是对着身边的一个哥们说:“Hi,老哥,把你的settings文件给我一份呗”

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~

本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。

Maven的仓库和settings.xml配置文件的更多相关文章

  1. 设置阿里云maven中央仓库的settings.xml

    本来想找一个可用的设置文件,结果乱七八糟的,干脆自己做了一个,同时还放上了Spring的SNAPSHOT和MILESTONE/RELEASE仓库,希望能帮到一些人. <?xml version= ...

  2. Maven项目使用Nexus作为远程仓库的settings.xml配置

    Maven项目使用Nexus作为远程仓库的settings.xml配置(转) 在自己电脑C:\Users\hanmm\.m2\下的setting.xml. 1.服务器配置 <server> ...

  3. IDEA设置maven修改settings.xml配置文件无法加载仓库

    作为初学者配置maven一般网上搜索.然后你就看到各种配置文件片段,首先配置镜像,然后配置仓库.完事后再IDEA里面配置下maven的路径和配置文件路径. 这些文章属实坑爹,完全没讲一个重要的配置就是 ...

  4. Maven的Settings.xml配置文件解释

    该配置用于单用户配置和全局配置, 单用户配置默认存放于 ${user.home}/.m2/目录中. 全局配置默认存放于Maven安装目录下面的conf目录中. 这两个默认的位置都可以修改. <? ...

  5. 详解Maven用户的配置settings.xml

    Maven用户设置 作者其他技术文章 1)Oracle性能优化之查询语句通用原则 2)Redis常用命令 3) SpringCloud入门之常用的配置文件 application.yml和 boots ...

  6. maven 配置篇 之 settings.xml

    maven2 比起maven1 来说,需要配置的文件少多了,主要集中在pom.xml和settings.xml中.    先来说说settings.xml,settings.xml对于maven来说相 ...

  7. settings.xml配置文件详解

    简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...

  8. maven command line specified settings.xml

    1. using argument parameter --settings  / or -s for shot mvn install --settings c:\user\settings.xml ...

  9. [JAVA] maven 阿里云节点 settings.xml

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

随机推荐

  1. 04-树5 Root of AVL Tree (25 分)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  2. 【AtCoder】 ARC 101

    link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...

  3. C++ STL(标准模板库)的学习了解

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...

  4. Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)

    阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...

  5. FileInputFormat 的实现之TextInputFormat

    说明 TextInputFormat默认是按行切分记录record,本篇在于理解,对于同一条记录record,如果被切分在不同的split时是怎么处理的.首先getSplits是在逻辑上划分,并没有物 ...

  6. [技术博客]React Native——HTML页面代码高亮&数学公式解析

    问题起源 原有博文显示时代码无法高亮,白底黑字的视觉效果不好. 原有博文中无法解析数学公式,导致页面会直接显示数学公式源码. 为了解决这两个问题,尝试了一些方法,最终利用开源类库实现了页面美化. (失 ...

  7. arcpy地理处理工具案例教程-将细碎图斑按相同属性或相近属性合并相邻图斑

    arcpy地理处理工具案例教程-将细碎图斑按相同属性或相近属性合并到相邻图斑 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 目的:针对存在的细碎 ...

  8. Openresty与Tengine

    Tengine官方网站:http://tengine.taobao.org/index_cn.html OpenResty官方网站:http://openresty.org/ Openresty和Te ...

  9. Logstash动态模板映射收集Nginx的Json格式日志

    Logstash传输给ES的数据会自动映射为5索引,5备份,字段都为text的的索引.这样基本上无法进行数据分析.所以必须将Logstash的数据按照既定的格式存储在ES中,这时候就要使用到ES模板技 ...

  10. CentOS使用yum安装最新版nginx步骤

    sudo yum install yum-utilsvi  /etc/yum.repos.d/nginx.repo 输入: [nginx-stable]name=nginx stable repoba ...