本文主要是针对《maven实战》书中关键知识点的学习记录,未免有纰漏或描述不到之处,建议购买阅读原书

本文涉及一些maven仓库和镜像中一些简单的概念

简介

对于maven来说,仓库只分为2类,本地仓库远程仓库。maven的规则是优先在本地仓库进行寻找,如果本地仓库没有,那么便从远程仓库进行获取。如果二者都没有,那么会报错。

比较多的情况是,maven会因为网络的原因,而仓库里并没有下载到jar包,而只有.jar.lastupdate.pom这2个文件。而查看pom.xml文件的时候也不会报错。那么久需要删除本地仓库中,这个包的目录,重新下载。

私服也属于是远程仓库,私服的目的是为了节约网络带宽,而在局域网内搭建的一个maven服务器。

本地仓库

当没有修改本地maven配置的时候,默认会在当前用户目录下的.m2/repository/下作为本地的仓库。在maven安装目录的conf下有个settings.xml的文件,可以对本地仓库的路径进行设置。

<settings>
<localRepository>D:/maven/maven-repository/</localRepository>
</settings>

注意,其实还有一种settings是可以只针对当前用户的,就是在.m2/settings.xml,不过这个xml文件一般是不存在,需要自己手工的去创建。而conf目录下的settings文件,是一个全局的配置,是针对于所有的用户。

远程仓库

本地仓库像是我们自己的书房,我们在自己的书房里去寻找某本书,发现没有,那么久是去书店或在网上去购买。在maven世界中,书店或网上商城,都可以看做是远程仓库。

远程仓库中使用比较多的是central仓库(也是默认仓库),此外还有一些如Jboss的远程仓库,具体要根据项目的实际情况来设置。

maven默认使用central仓库,如果还需要使用其他仓库,则需要再pom.xml中进行类似下面的配置

<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

注意里面的snapshot的值为false,表示不从仓库中下载快照版本。因为snapshot是经常发生变化的,而我们实际使用的包,往往都希望是稳定的,这样对于我们的工程来讲是比较安全。

远程仓库的更新

与snapshot有类似作用的一个标签是release,表示对发行版本的下载。默认是true。而snapshot和release这2个标签,都有2个子元素。

<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshot>

updatePolicy表示检查更新的策略,默认是每天更新一次,其他值包括never从不检查更新;always每次构建时都检查更新;interval X, 每隔x分钟检查一次

checksumPolicy是针对于校验和,当文件被部署到远程仓库中时,会生成一份校验和的文件,有点类似数字签名,来代表这个文件没有被修改过。在maven下载的时候,会根据校验和文件来进行校验,如果校验失败,那么会根据这个属性来决定是否要进行警告。ignore则表示不进行警告,还有warn表示构建时给予警告,而fail表示会让构建变为失败。

远程仓库的认证

一般我们像私服都会是公示自己内部构建的,那么有的私服仓库可能不适用于其他部门,那么会有一个账户密码的认证。这个配置信息是存在在settings.xml中的。值得注意的是,里面的这个id,需要和你在pom.xml中配置的id要一致。

<servers>
<server>
<id>my-proj</id>
<username>repo-my</username>
<password>123123</password>
</server>
</servers>

部署到远程仓库

在工程的pom.xml文件内,需要进行配置,而这个配置是distributionManagement元素。

<distributionManagement>
<repository>
<id>proj-my</id>
<name>123</name>
<url>http://xxx</url>
</repository>
<snapshotRepository>
<id>proj-my</id>
<name>123</name>
<url>http://xxx</url>
</snapshotRepository>
</distributionManagement>

snapshotRepository表示是快照版本要发布的仓库地址。一般这种部署都是需要认真的,而认证的配置就是上面说提到的。

真的要进行部署的时候,就执行mvn clean deploy 即可。

快照版本

试想,有2个部门因为某项紧急的任务需要合作,2个部门的工作需要同时展开,工作中需要将自己的功能代码发布到局域网内的私服仓库中去。如果maven没有快照的机制,那么可能在每次其中一个部门发布一个版本的时候,那么就需要通知另外的部门,将pom.xml文件中的版本号去进行修改。

显然,这是一件很麻烦的事情。

快照版本要解决的就是类似这样,可能会频发发布版本,而又不需要去修改pom.xml的情形。在发布到私服的过程中,maven会自动将snapshot进行替换,打上时间戳。那么另外的一个部门,在进行获取的时候,就可以根据时间戳来获取到最新的文件,这个检查默认是每次执行一次。

快照的版本应该只在组织内部或模块间的依赖中使用,因为快照是十分不稳定的版本,可能今天构建时可以了,但到了明天就不行。

依赖解析

  • 当依赖的范围是system时,直接从本地文件系统解析构件
  • 根据依赖坐标计算仓库路径,先尝试从本地寻找,本地没有,则从远程仓库去获取
  • 在本地仓库不存在的情况下
    • 如果依赖的构件是显示的发布版本,例如1.2.1或者1.2.-beta-1这种,则便利所有远程仓库,发现则下载。
    • 如果是RELEASE或LATEST,则基于更新策略,读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,与本地仓库对应的元数据进行合并,得到RELEASE或LATEST的真实值
    • 如果是SNAPSHOT,读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,与本地仓库对应的元数据进行合并,得到SNAPSHOT的真实值
    • 如果最后解析得到的构件版本是时间戳格式的快照(e.g. 1.4.1-20191101.121403-3),则复制时间戳格式的文件至非时间戳格式。如SNAPSHOT。

镜像

镜像的作用和cdn很类似,因为GFW的关系,很多外国的仓库访问速度很慢或者无法访问,那么就可以借助一些国内的一些大公司提供的镜像地址来加快文件的下载,个人用的比较多的是阿里的镜像地址。

<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>

maven仓库和镜像的更多相关文章

  1. 【转】maven仓库快速镜像

    本文转自:http://blog.csdn.net/zuoluoboy/article/details/20007819 国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的mav ...

  2. Maven仓库国内镜像站

    感谢阿里巴巴,搭建并公开了Maven仓库的国内镜像站.话外:使用Maven的官方仓库真的是太slow了! 在<Maven Root>/conf/settings.xml中的<mirr ...

  3. maven仓库国内镜像

    <mirror>        <id>alimaven</id>        <name>aliyun maven</name>     ...

  4. maven仓库快速镜像

    国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ====================国内OSChina提供的镜像,非常不错=========== ...

  5. 给maven仓库添加镜像

    用maven下载好慢啊,快试试阿里云镜像吧!修改$MAVEN_HOME/conf/settings.xml <!-- 阿里云仓库 --> <mirror> <id> ...

  6. Maven仓库 国内镜像

    <repositories> <repository> <id>repo-mirror</id> <url>http://maven.net ...

  7. 04 Maven 仓库

    Maven 仓库 在 Maven 坐标与依赖 中详细介绍了 Maven 坐标和依赖,坐标和依赖是任何一个构件在 Maven 世界中的逻辑表示方式:而构件的物理表示方式是文件, Maven 通过仓库来统 ...

  8. 常用 Maven 仓库地址

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/niuzhucedenglu/article ...

  9. 国内下载比较快的Maven仓库镜像

    #收集的比较快的maven仓库 http://maven.wso2.org/nexus/content/groups/public/ http://jcenter.bintray.com/http:/ ...

随机推荐

  1. uni-app中组件的使用

    组件基本知识点: uniapp中:每个页面可以理解为一个单页面组件,这些单页面组件注册在pages.json里,在组件关系中可以看作父组件. 自定义可复用的组件,其结构与单页面组件类似,通常在需要的页 ...

  2. 使用tkinter打造一个小说下载器,想看什么小说,就下什么

    前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...

  3. yum install nginx-没有可用软件包 nginx。

    1. 错误提示 Centos 7下安装nginx,使用yum install nginx,报错提示没有可用的软件包.具体错误提示如下: 已加载插件:fastestmirror, product-id, ...

  4. sqli-labs 54-65(CHALLANGES)

    challenges less-54 less-55 less-56 less-57 less-58 less-59 less-60 less-61 less-62 less-63 less-64 l ...

  5. gnuplot添加直线和箭头

    http://blog.csdn.net/bill_chuang/article/details/18215051 6.在图中添加直线和箭头 gnuplot> set arrow from 0. ...

  6. [日常摸鱼]bzoj1036 [ZJOI2008]树的统计Count

    听说后天会考x 省选居然还考模板题的么(好吧好像NOI也有考而且也是树剖-) 题意:一棵树,每个点有权值,三种操作:单点修改.求链上最大值.求链上权值和. 直接上模板. 我可能不会写单点修改的线段树了 ...

  7. angular8 大地老师学习笔记---第八课

    /*ViewChild获取dom节点 1.模板中给dom起一个名字 <div #myBox> 我是一个dom节点 </div> 2.在业务逻辑里面引入ViewChild imp ...

  8. java基础模拟考试三套试卷

    卷1: 一.单选题(15道,共30分) //1.下列关于JDK.JRE.JVM关系描述正确的是 (A) A:JDK是开发工具,包含了JRE.JRE是运行环境,包含了JVM.JVM是虚拟机,可以保证跨平 ...

  9. windows服务器安装exe文件出错

    今天在安装exe文件的时候出现了错误,记录如下: 服务器环境为windows 2016数据中心标准英文版.要安装的软件为***.exe.按照在本地电脑上安装的方法,直接双击打开,然后错误出现如下图: ...

  10. 基于Redis的消息队列使用:spring boot2.0整合redis

    一 . 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...