Maven快照机制(SNAPSHOT)

如下引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_snapshots.htmlhtml

1、场景前端

一个大型的软件应用一般包含多个模块,而且一般的场景是多个团队开发同一应用的不一样模块。举个例子,设想一个团队开发应用的前端,项目为app-ui(app-ui.jar:1.0),而另外一个团队开发应用的后台,使用的项目是data-service(data-service.jar:1.0)git

如今可能出现的状况是开发data-service的团队正在进行快节奏的bug修复或者项目改进,而且他们几乎每隔一天就要发布库到远程仓库。apache

如今若是data-service团队每隔一天上传一个新版本,那么将会出现下面的问题:服务器

  • data-service团队每次发布更新的代码时都要告知app-ui团队。
  • app-ui团队须要常常地更新他们pom.xml文件到最新版本。

为了解决这种状况, 快照(SNAPSHOT)的概念派上了用场。app

2、什么是快照(SNAPSHOT)maven

快照(SNAPSHOT)是一种特殊的版本,指定了某个当前的开发进度的副本。不一样于常规的版本,Maven每次构建都会在远程仓库中检查新的快照ui

如今data-service团队会每次发布更新代码的快照到仓库中,好比说data-service:1.0-SNAPSHOT来替代旧的快照jar包。spa

注意:每次更新jar包时,版本好不变,且后缀必须带上-SNAPSHOT。code

3、项目快照(Snapshot) VS 版本(Version)

版本(Version)的状况下,若是Maven之前下载过指定的版本文件,好比说data-service:1.0Maven将不会再从仓库下载新的可用的1.0文件。若要下载更新的代码,data-service的版本须要升到1.1

快照(Snapshot)的状况下,每次app-ui团队构建他们的项目时,Maven将自动获取最新的快照(data-service:1.0-SNAPSHOT)。

备注:版本(Version)存放在Release发布仓库。快照(Snapshot)存放在Snapshot快照仓库。

注意:版本(Version)的概念,只要不带有-SNAPSHOT的关键字时,都会认为这是一个在Release发布仓库的jar包。其中在Release发布仓库的jar包命名除了具体的版本号以后还能够带上好比:1.0-Release、1.0-rc1等等的字样。

4、原理详解

Maven中的仓库分为两种,Snapshot快照仓库Release发布仓库Snapshot快照仓库用于保存开发过程当中的不稳定版本,Release正式仓库则是用来保存稳定的发行版本。定义一个组件/模块为快照版本,只须要在pom.xml文件中在该模块的版本号后加上-SNAPSHOT便可(注意这里必须是大写),以下所示:

<groupId>com.jsoft.test</groupId>
<artifactId>testcommon</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>jar</packaging>

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

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

虽然,快照的状况下,Maven在平常工做中会自动获取最新的快照,你也能够在任何Maven命令中使用-U参数强制Maven下载最新的快照构建。命令以下:

mvn clean package -U

 

参考文章:

http://www.mzone.cc/article/277.html

https://maven.apache.org/settings.html#Repositories