1. 场景
一个项目通常包含多个模块,如果每一个模块分工给不同的团队或者人员去开发,在项目的开始研发阶段,各个模块更新迭代的频率非常高。
假如一个ERP系统的产品模块为erp-product(erp-product.jar:1.0.0),而另一个库存模块是为erp-inventory(erp-inventory:1.0)。
库存模块需要依赖产品模块,才能正常使用。
如果erp-product模块正在进行快节奏的bug修复或者项目改进,并且频繁提交到发布库到远程仓库。
而erp-inventory模块在发布版本时,需要知道erp-product模块的当前最新的版本,那么将会出现下面的问题:
更新erp-product团队每次发布更新的代码时都要通知erp-inventory团队修改版本号。
erp-inventory团队需要经常地更新pom.xml文件依赖的erp-product的版本号。
为了解决这种情况, 快照(SNAPSHOT)的概念派上了用场。
2、什么是快照(SNAPSHOT)?
快照(SNAPSHOT)是一种特殊的版本,指定了某个当前的开发进度的副本。
不同于常规的版本,Maven每次构建都会在远程仓库中检查新的快照。
现在erp-product团队会每次发布更新代码的快照到仓库中,比如说erp-product.jar:1.0.0-SNAPSHOT来替代旧的快照jar包。
注意:每次更新jar包时,版本号不变,且后缀必须带上-SNAPSHOT。
这样erp-inventory团队在每次打包时,不需要更新erp-product模块的版本号,自动从SNAPSHOT仓库拉取最新引用的模块。
3、项目快照(Snapshot) VS 版本(Version)
版本(Version)的情况下,如果Maven以前下载过指定的版本文件,比如说erp-product:1.0.0,Maven将不会再从仓库下载新的可用的
1.0文件。若要下载更新的代码,erp-product的版本需要升到1.1。
快照(Snapshot)的情况下,每次erp-inventory团队构建他们的项目时,Maven将自动获取最新的快照(erp-product:1.0.0-SNAPSHOT)。
备注:版本(Version)存放在Release发布仓库。快照(Snapshot)存放在Snapshot快照仓库。
注意:版本(Version)的概念,只要不带有-SNAPSHOT的关键字时,都会认为这是一个在Release发布仓库的jar包。其中在Release发
布仓库的jar包命名除了具体的版本号之后还可以带上比如:1.0-Release、1.0-rc1等等的字样。
4、Maven仓库
Maven中的仓库分为两种,Snapshot快照仓库和Release发布仓库。
Snapshot快照仓库用于保存开发过程中的不稳定版本,Release正式仓库则是用来保存稳定的发行版本。
如下所示,通常我们的私服服务器会存在两个仓库地址:
<distributionManagement>
<repository>
<id>releases</id>
<url>http://192.168.0.222/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://192.168.0.222/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
定义一个组件/模块为快照版本,只需要在pom.xml文件中在该模块的版本号后加上-SNAPSHOT即可(注意这里必须是大写),如下所示:
<dependency>
<groupId>com.king.test</groupId>
<artifactId>erp-product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
</dependency>
Maven会根据模块的版本号(pom.xml文件中的version)中是否带有-SNAPSHOT来判断是快照版本还是正式版本。
如果是快照版本,那么在mvn deploy时会自动发布到快照版本库中,而使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,Maven会自动从镜像服务器上下载最新的快照版本。
如果是正式发布版本,那么在mvn deploy时会自动发布到正式版本库中,而使用正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块则不会主动去镜像服务器上下载。
如示例中,erp-product:1.0.0-SNAPSHOT如果打包发布,会发布到snapshotRepository仓库中。
所以,我们在开发阶段,可以将公用库的版本设置为快照版本,而被依赖组件则引用快照版本进行开发,在公用库的快照版本更新后,我们也不需要修改pom.xml文件提示版本号来下载新的版本,直接Maven执行相关编译、打包命令即可重新下载最新的快照库了,从而也方便了我们进行开发。
虽然,快照的情况下,Maven在日常工作中会自动获取最新的快照,你也可以在任何Maven命令中使用-U参数强制Maven下载最新的快照构建。命令如下:
mvn clean package -U