本文主要是针对《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. gitignore文件

    gitignore文件 python .gitignore .idea/ *.bak test* logs/ *.log # *.txt # Byte-compiled / optimized / D ...

  2. Linux 安装 MySQL 8 数据库(图文详细教程)

    本教程手把手教你如何在 Linux 安装 MySQL 数据库,以 CentOS 7为例. 1. 下载并安装 MySQL 官方的 Yum Repository wget -i -c https://re ...

  3. flink安装及standalone模式启动、idea中项目开发

    安装 环境 Ubuntu 18 jdk8 flink-1.8.1 安装步骤 安装jdk(略) 下载flink-1.8.1-bin-scala_2.12.tgz,解压到指定目录 wget http:// ...

  4. ATS push cache 测试

    测试 ATS 注入缓存 参考了: http://serverfault.com/questions/471684/push-content-to-apache-traffic-servers-cach ...

  5. Linux下安装ffmpeg,视频格式转换

    下载ffmpeg 从ffmpeg官网:http://ffmpeg.org/download.html 下载最新的ffmpeg安装包,然后通过如下命令解压: 解压 ffmpeg-*.tar.bz2 文件 ...

  6. openstack高可用集群21-生产环境高可用openstack集群部署记录

    第一篇 集群概述 keepalived + haproxy +Rabbitmq集群+MariaDB Galera高可用集群   部署openstack时使用单个控制节点是非常危险的,这样就意味着单个节 ...

  7. jquery ajax return不起作用

    jquery的ajax方法:在success中使用return:来结束程序的时候,结束的只是success这个方法,也就是说success中的return的作用范围只是success: 如果要想在su ...

  8. 【命令】at命令和cron命令

    博文链接:https://www.cnblogs.com/l75790/articles/9191753.html

  9. Sentinel并发限流不精确-之责任链

    ​ 在之前调研Sentinel的过程中,为了准备分享内容,自己就简单的写了一些测试代码,不过在测试中遇到了一些问题,其中有一个问题就是Sentinel流控在并发情况下限流并不精确,当时我还在想,这个我 ...

  10. CentOS7下常用安装服务软件源码编译安装方式的介绍

    简介:介绍源码编译安装软件包的管理 源码安装优点:编译安装过程,可以设定参数,指定安装目录,按照需求进行安装,指定安装的版本,灵活性比较大. 源码安装的缺点:需要对依赖包一个一个的进行安装,不敢随便升 ...