Maven的版本分为快照和稳定版本,快照版本使用在开发的过程中,方便于团队内部交流学习。而所说的稳定版本,理想状态下是项目到了某个比较稳定的状态,这个稳定包含了源代码和构建都要稳定。
一、如何衡量项目的稳定状态呢?
1. 所有的自动化测试应当全部通过
2. 项目没有配置任何快照版本的依赖
3. 项目没有配置任何快照版本的插件
4. 项目所包含的代码都已经全部提交到了版本控制系统中
5.我们应当再一次执行Maven构建,以确保项目的状态是OK的
6. 我们将这一次变更提交到版本控制的主干中,并打上标签,只有满足了上述6个条件, 我们就可以将这一个快照版本更新至发布版本
二、在开发的过程中,版本号要如何进行变更呢?Maven是否有潜在的约定?
我们在开发的过程中,下载jar包的时候经常会发现某个jar类似这样:1.2.3-beat-4.jar
多么复杂的一个名称。。。下面来解释一下,这里每个数字的含义:
“ 1 ” : 表示该版本的第一个重大版本
“ 2 ” : 表示这是基于重大版本的第二个次要版本
“ 3 ” : 表示该次要版本的第三个增量
" beat-4" : 表示该增量的一个里程碑
用一个图来描述:
< 主版本 > ------ < 次版本 > ------ < 增量版本 > ------ < 里程碑版本 >
主版本:表示了项目的重大架构变更 struts1 -- struts2
次版本:表示较大范围的功能增加和变化 Nexus1.5 ---- Nexus1.4
增量版本:一般表示重大Bug修复
里程碑版本:指某一个版本的里程碑 *.*-alpha-1 *.*-beat-1
看起来有点麻烦啊, 但是在一般来说,我们只会声明主版本和次版本,增量版本和里程碑版本就不一定了。
注:maven中约定的版本次序:
对于主版本、次版本、增量版本来说他们的比较是基于数字的,因此:1.5>1.4>1.3>1.2.11>1.2.8
对于里程碑版本来说,比较是基于字符串的,因此:1.5>1.4>1.3>1.2.3>1.2.11
三、主干、分支、标签
上面的笔记中提到了主干和标签,到底如何理解主干、分支、标签呢?
主干: 项目开发代码的主体,是从项目开始到当前都处于活动的状态,从这里可以获得项目最新的源代码和几乎所有的变更历史
分支: 从主干的某个点分离出来的代码拷贝,通常可以在不影响主干的前提下,在这里进行重大的bug修复或者实验性质的开发,如果达到了预期的目的,通常将这里的变更合并到主干中去。
标签: 用来标识主干或者分支的某个点的状态,以代表项目的某个稳定状态,也就是通常说的发布状态
这三个元素,可以清晰的描述出项目的版本管理,而且也已经成了一个默认的行业标准。
四、自动化版本发布
用久了手动版本发布之后,我们会想到能否进行自动化的发布版本,答案是肯定的,这将引入一个新的插件:Maven Release Plugin
通过一些必要的配置,就可以完成版本发布
Maven Release Plugin 插件简介:
该插件主要有三个目标:release: prepare, release: rollback, release: perform (什么是插件目标),在介绍分支自动化的时候还会引入branch目标
①release:prepare 准备版本发布,依次执行下列操作
1. 检查项目是否有未提交的代码
2. 检查项目是否有快照版本依赖
3. 根据用户的输入将快照版本升级为发布版
4. 将POM中的SCM信息更新为标签地址
5. 基于修改后的POM执行maven构建
6. 提交POM变更
7. 基于用户输入为代码打标签
8. 将代码从发布版升级为新的快照版
9.提交POM变更
release: rollback
回退release: prepare所执行的操作。将POM回退至release:prepare之前的状态,并提交。
注:该步骤不会删除release:prepare生成的标签,需要用户手动删除
release: perform
执行版本发布
签出release:prepare生成的标签中的源代码,并在此基础上执行mvn deploy命令打包并部署构件至仓库
注:要为项目发布版本,首先需要为其添加正确的版本控制系统信息(这是因为Maven Release Plugin需要知道版本控制系统的主干、标签等地址后才能执行相关操作)
②分支的自动化创建
先看一下Maven Release Plugin 的branch目标能帮助我们做哪些事情
1. 检查本地有无未提交的代码
2. 将分支更改POM的版本,如:1.1.0-SNAPSHOT改成1.1.1-SNAPSHOT
3. 将POM中的SCM信息更新为分支地址
4. 提交以上更改
5. 将主干代码复制到分支中
6. 修改本地代码使其回退到分支前的版本(用户可以指定新的版本)
7. 提交本地更改
注:此时也必须正确的配置SCM信息
五、代码安全
代码安全是我们比较关心的一个问题, 比如说,当我们从中央仓库下载第三方构件的时候,我们可能要去验证这些文件的合法性,或者当我们发布项目后,使用我们项目的人也要验证
引入一个新的插件:Maven GPG Plugin 自动的完成签名
在使用Maven GPG Plugin之前,首先需要确定GPG是可用的,然后再POM中配置插件即可
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
然后使用一般的Maven命令签名并发布项目构件
$mvn clean deploy -Dgpg.passphrase=****
注:如果不提供 -Dgpg.passphrase参数,运行时就会要求输入密码

Maven学习总结(24)——Maven版本管理详解的更多相关文章

  1. 【maven学习】pom.xml文件详解

    环境 apache-maven-3.6.1 jdk 1.8 eclipse 4.7 POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示, ...

  2. 【maven学习】settings.xml文件详解

    环境 apache-maven-3.6.1 jdk 1.8 eclipse 4.7 Settings.xml是设置maven参数的配置文件,包含类似本地仓储位置.修改远程仓储服务器.认证信息等配置.p ...

  3. Maven学习小结(五 pom.xml详解[转])

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. Maven配置文件POM属性最全详解

    注:本文内容来源于: BlueKitty1210 <Maven配置文件POM属性最全详解> <project xmlns="http://maven.apache.org/ ...

  5. IP2——IP地址和子网划分学习笔记之《子网掩码详解》

    2018-05-04 16:21:21   在学习掌握了前面的<进制计数><IP地址详解>这两部分知识后,要学习子网划分,首先就要必须知道子网掩码,只有掌握了子网掩码这部分内容 ...

  6. MAVEN学习笔记之Maven插件的应用(4)

    MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...

  7. Java学习-007-Log4J 日志记录配置文件详解及实例源代码

    此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...

  8. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

  9. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  10. Linux学习之文件特殊权限详解(SetUID、SetGID、Sticky BIT)(十一)

    Linux学习之文件特殊权限详解(SetUID.SetGID.Sticky BIT) 目录 SetUID SetGID Sticky BIT SetUID SetUID简介 只有可以执行的二进制程序和 ...

随机推荐

  1. DOM中元素节点,属性节点,文本节点的理解

    节点信息 每个节点都拥有包含着关于节点某些信息的属性.这些属性是: nodeName(节点名称) nodeValue(节点值) nodeType(节点类型) nodeType nodeType 属性可 ...

  2. chrome安装插件,安装Postman

    1.下载postman插件,可以自己到网上下载,也可以点击http://download.csdn.net/detail/u010246789/9528471 2.解压文件,在解压后的文件夹中找到.c ...

  3. [SharePoint2010开发入门经典]创建你的第一个SPS2010程序

    本章概要: 1.创建一个解决方案,使他能读写数据从列表中,使用服务器端对象模型和可视的web部件 2.使用VS2010构建部署解决方案 3.使用图标web部件渲染列表数据 4.在一个解决方案中集成不同 ...

  4. 请用Java设计一个Least Recently Used (LRU) 缓存

    LRU介绍:LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的, 思路介绍: 能够使用两个标准的数据结构来实现.Map和Queue.由于须要支持多 ...

  5. hdu 4997 Biconnected

    这题主要是计算连通子图的个数(c)和不连通子图的个数(dc)还有连通度为1的子图的个数(c1)和连通度为2以上的子图的个数(c2)之间的转化关系 主要思路大概例如以下: 用状态压缩的方法算出状态为x的 ...

  6. Gzip压缩优化网站

    网站常使用GZIP压缩算法对网页内容进行压缩,然后传给浏览器,以减小数据传输量,提高响应速度.浏览器接收到GZIP压缩数据后会自动解压并正确显示.GZIP加速常用于解决网速慢的瓶颈. 压缩Filter ...

  7. (素数求解)I - Dirichlet&#39;s Theorem on Arithmetic Progressions(1.5.5)

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit cid=1006#sta ...

  8. Project Euler:Problem 37 Truncatable primes

    The number 3797 has an interesting property. Being prime itself, it is possible to continuously remo ...

  9. ComponentName

    ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务. 实例化一个ComponentName需 ...

  10. iOS 权限判断 跳转对应设置界面

    相机权限 1.1 使用说明 在合适的地方导入#import <AVFoundation/AVFoundation.h> 使用AVAuthorizationStatus类获取当前权限状态 在 ...