在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次。我们知道,maven的依赖管理是基于版本管理的,对于发布状态的artifact,如果版本号相同,即使我们内部的镜像服务器上的组件比本地新,maven也不会主动下载的。

如果我们在开发阶段都是基于正式发布版本来做依赖管理,那么遇到这个问题,就需要升级组件的版本号,可这样就明显不符合要求和实际情况了。但是,如果是基于快照版本,那么问题就自热而然的解决了,而maven已经为我们准备好了这一切。

maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本。定义一个组件/模块为快照版本,只需要在pom文件中在该模块的版本号后加上-SNAPSHOT即可(注意这里必须是大写),如下:

<groupId>cc.mzone</groupId>
<artifactId>m1</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>jar</packaging>

maven2会根据模块的版本号(pom文件中的version)中是否带有-SNAPSHOT来判断是快照版本还是正式版本。如果是快照版本,那么在mvn deploy时会自动发布到快照版本库中,而使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,maven会自动从镜像服务器上下载最新的快照版本。如果是正式发布版本,那么在mvn deploy时会自动发布到正式版本库中,而使用正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块则不会主动去镜像服务器上下载。

所以,我们在开发阶段,可以将公用库的版本设置为快照版本,而被依赖组件则引用快照版本进行开发,在公用库的快照版本更新后,我们也不需要修改pom文件提示版本号来下载新的版本,直接mvn执行相关编译、打包命令即可重新下载最新的快照库了,从而也方便了我们进行开发。

快照版本的管理的本质是metadata.xml,里面有时间戳的对比,(以时间作为标准而不是版本号):

metadata.xml 例子:

<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0"><groupId>com.my.testu</groupId><artifactId>testu</artifactId><version>1.0.1-SNAPSHOT</version><versioning><snapshot><localCopy>true</localCopy></snapshot><lastUpdated>20130307084852</lastUpdated><snapshotVersions><snapshotVersion><extension>jar</extension><value>1.0.1-SNAPSHOT</value><updated>20110407084852</updated></snapshotVersion><snapshotVersion><extension>pom</extension><value>1.0.1-SNAPSHOT</value><updated>20110407084852</updated></snapshotVersion></snapshotVersions></versioning>
</metadata>

这个时候,你运行项目(项目依赖快照testu-jar)maven做了什么呢(背景:设置本地通过配置镜像,使本地Maven的任何资源都是从远程仓库的Maven服务器下载的)?

Step1:从远程的Maven服务器上下载maven-metadata.xml,重命名为“maven-metadata-<RepositoryID>.xml”,并保存到本地仓库相应目录。

Step2:比较maven-metadata-local.xml与maven-metadata-<RepositoryID>.xml中的lastUpdated时间戳的值。

  • 如果maven-metadata-local.xml中的时间戳比较大,则终止。
  • 如果maven-metadata-<RepositoryID>.xml中的时间戳较大,则从仓库Maven服务器上下载最新版本。即:testu-1.0.1-20130407.081828-34.jar。这个过程分两步:(1)下载testu-1.0.1-20130407.081828-34.jar到本地Maven仓库。(2)将testu-1.0.1-20130407.081828-34.jar复制一份,覆盖掉原先的testu-1.0.1-SNAPSHOT.jar。也就是说,如果Maven从远程仓库下载了最新的SNAPSHOT发布包的话,那么最新的待时间戳的包和xxx-SNAPSHOT包是完全一样的。

maven中snapshot快照库与maven-metadata.xml相关推荐

  1. maven2中snapshot快照库和release发布库的应用

     http://www.mzone.cc/article/279.html 转载声明] 转载时必须标注:本文来源于铁木箱子的博客http://www.mzone.cc [本文地址] 本文永久地址是 ...

  2. maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository. ...

  3. pom.xml 配置之:snapshot 快照库和 release发布库 的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.如果在发布时使用 mvn deploy -P release 的命令,那么会自动使用0.1作为发 ...

  4. maven配置之:<distributionManagement>snapshot快照库和release发布库

    在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次. 我们知道,maven的依赖管理是基于版本管理的 ...

  5. maven中snapshot版本和正式版本的区别

    参考链接:https://www.cnblogs.com/huang0925/p/5169624.html 理解Maven中的SNAPSHOT版本和正式版本 Maven中建立的依赖管理方式基本已成为J ...

  6. 【Maven学习】定制库到Maven本地资源库

    目标:手工操作将一个jar安装到本地仓库 第一步:首先获取到jar包,可以是第三方的 也可以是自己创建的,放到本地任意目录 比如:joda-time-2.10.3,放到C:\jar\  目录下面 第二 ...

  7. 在maven中使用c3p0连接池的c3p0-config.xml文件出现named-config with name ‘xxxxx‘ does not exist. Using default-con

    本人之前都用的java下的web application创建项目,第一次用maven创建web项目, 在我导c3p0配置文件的时候出现了 named-config with name 'xxxx' d ...

  8. Maven中的库(repository)详解

    Maven中的库(repository)是构件(artifact)的集合.构件以一定的布局存储在库中. Maven中的库(repository)可以分为本地库和远程库.本地库在安装Maven的计算机上 ...

  9. 快速配置Maven到OSChina中央库的教程

    2019独角兽企业重金招聘Python工程师标准>>> 首先,感谢OSChina为我们提供了国内的 Maven 中央库,免去了偶尔无法连接国外Maven库蛋疼的问题,小弟首先在此表示 ...

最新文章

  1. linux信号处理编程实验报告,Linux编程之信号处理
  2. 使用wordpress创建自己的博客
  3. jquery的$.extend和$.fn.extend作用及区别(—)
  4. Docker + Zookeeper + SolrCloud(8.1.1)跨主机搭建集群有问题
  5. 学习java 第三天 数据类型以及存储大小取值范围 (one 大白 (●—●))
  6. 微型计算机原理中ADC,微机原理实验-逐比较式ADC.doc
  7. 【luogu P2764 最小路径覆盖问题】 模板
  8. spring源码 学习方法
  9. 在计算机中表示一个信息容量的基本单位是,微型计算机中,存储器容量的基本单位是()。...
  10. 单细胞测序系列之二:单细胞基因组测序
  11. 2010年10月1日 工作 计划 发奋图钱 再接再厉
  12. 计算机上用户名怎么设置,电脑用户名,详细教您电脑用户名怎么修改
  13. vue实现一键换肤效果(白天晚上模式切换)
  14. 《方块方舟》自定义服务器工具,新闻-方块方舟官网-ARK正版授权-开放式体素沙盒生存游戏...
  15. 基于docker搭建django的web图书管理系统
  16. python用户手册是什么_Wind量化平台-用户手册(Python).pdf
  17. fastapi身份认证
  18. [PCIE703]FPGA实时处理器-XCKU060+ARM(华为海思视频处理器-HI3531DV200)高性能综合视频图像处理平台设计资料及原理图分享
  19. 关于5G 的十点思考
  20. Python趣味算法入门 - 牛顿迭代法求方程根

热门文章

  1. 用editplus批量修改文件编码最快速的方法
  2. Kettle, Solr
  3. factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入
  4. 无状态mysql_既然HTTP是无状态协议,mysql_close还有必要么?
  5. window10 java 设置环境变量
  6. PLSQL Developer 运用Profiler 分析存储过程性能
  7. Android--使用VideoView播放视频
  8. zookeeper集群自动启动脚本
  9. JavaScript正则表达式-基础入门
  10. 让架构更简单,QCon上海2016热点前瞻