本文主要是针对《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. linux 设置别名

    [root@oldboyedu45-xy data]# alias(查找别名) alias cp='cp -i' alias l.='ls -d .* --color=auto' alias ll=' ...

  2. li = [11,22,33,44,55,66,77,88,99]分类

    方法一: li = [11,22,33,44,55,66,77,88,99]s = []m = []for i in li: if i <= 55: s.append(i) else: m.ap ...

  3. mysql数据库设置超时断开连接

    mysql数据库长时间未操作自动断开连接由参数:interactive_timeout和wait_timeout控制,默认都是8小时(28800分钟) mysql> show variables ...

  4. 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)

    3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...

  5. gnuplot添加直线和箭头

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

  6. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  7. js上 十三、函数初步-2

    13-1.函数的参数 函数的本质: ü 函数的作用,代码重用,编写一个函数,就是为了解决一类问题. ü 函数每次调用,都有一个结果,那么结果和什么相关呢?y = x , y = x2,y = sin( ...

  8. js下 Day07、DOM案例

    一.折叠菜单 效果图: 功能思路分析: 功能一:数据渲染 \1. 模拟数据,一级数据为数组套对象的形式,二级数据为数组: \2. 先渲染一级数据,然后再嵌套渲染二级数据(map().join('')) ...

  9. Python常用内置对象

    1.在python中处理的一切都是对象. 2.内置对象可直接使用,如数字.字符串.列表.del等. 3.非内置对象需要导入模块才能使用,如正弦函数sin(x),随机数产生函数random()等.

  10. 死磕以太坊源码分析之txpool

    死磕以太坊源码分析之txpool 请结合以下代码阅读:https://github.com/blockchainGuide/ 写文章不易,也希望大家多多指出问题,交个朋友,混个圈子哦 交易池概念原理 ...