概述
版本号是一个产品的表示,在一个产品的生命周期中具有唯一性。内部的版本管理可以帮助研发、测试、产品、工程等各部门对产品执行严格的定义,避免出现因版本不一致而造成沟通问题和项目延迟。
版本管理
版本号分为四部分:主版本号.子版本号.修正版本号-SNAPSHOT
- 主版本号
当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1 - 子版本号
当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,后面的版本号复位为 0,因而可以被忽略掉 - 修正版本号
当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1
** 当对外发布时去掉-SNAPSHOT
当数据库发生变更时,所有相关系统都需要进行子版本号的增加操作
所有项目的子模块采用相同的版本号
例如:目前版本命名V1.0.0,计划发布一个测试版本,修改了部分bug,发布的测试版本则为V1.0.1.0,如果提交的版本仍然有bug需要修改,则下次提交版本V1.0.1.1,直至改测试版本提交测试通过后,发布正式版本V1.0.1,发布时去除-SNAPSHOT并保证他的所有依赖版本都是realease版。
涉及到数据库修改的版本,在发布时需要发布相同版本号的数据库升级sql文件
相关插件工具
批量修改父级项目版本vv
每次修改父级项目后 所有子模块项目的依赖父级项目版本号也要做修改,修改地方过多容易出错,所以使用插件进行处理
在父项目中增加插件
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.3</version>
<configuration>
<generateBackupPoms>false</generateBackupPoms>
</configuration>
</plugin>
</plugins>
</build>
每次修改父项目版本号之后执行下面的命令,子模块的依赖父项目版本号也会同步修改
mvn -N versions:update-child-modules
- 使用maven内置属性来处理子项目间的依赖关系
maven有一个内置属性${project.version}表示的是项目的版本号,当一个子模块依赖其他子模块时我们可以这样写:
<parent>
<groupId>parent-groupId</groupId>
<artifactId>parent-artifactId</artifactId>
<version>1.0.0</version>
<relativePath>..</relativePath>
</parent>
<artifactId>module-artifactId</artifactId>
<dependency>
<artifactId>other-module-artifactId</artifactId>
<groupId>other-module-groupId</groupId>
<version>${project.version}</version>
</dependency>
发布版本
每次发布版本都要做很多操作
修改版本号为正式版本
增加Git标签 tag
打包项目
deploy到maven
修改版本号到最新的snapshot版本
为了简化操作 我们使用maven-release-plugin来完成上面的操作
maven-release-plugin完成的工作有以下几点
- 生成release.properties文件
- 检查本地项目代码中是否有未提交的修改
- 检查依赖中是否有snapshot版本的依赖
- 更新POM,将项目的version从*-SNAPSHOT改为用户输入的发布版本
- 新建tag并提交
- 部署项目到资源库
- 修改pom文件到最新的snapshot版本
首先我们要在setting.xml中 增加公司的资源库镜像和阿里云的仓库镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>vionmaven</id>
<name>vion maven</name>
<url>http://ip:port/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
从上面的功能中我们发现,他需要链接我们的git版本库,这块的操作使用scm标签进行配置
<scm>
<developerConnection>scm:git:http://ip/project</developerConnection>
</scm>
还需要配置maven部署仓库的地址
<distributionManagement>
<repository>
<id>vionmaven</id>
<name>vion maven</name>
<url>http://ip:port/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>vionmaven</id>
<name>vion maven</name>
<url>http://ip:port/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
maven仓库部署是需要配置用户信息的,否则用户是无权部署jar包到maven库的
由于隐私的要求,用户名密码是无法在项目的pom中配置 只能在 maven的setting.xml中配置
<server>
<id>vionmaven</id>
<username>deployment</username>
<password>authpass</password>
</server>
最重要的是要增加release插件的配置 在项目pom中加入以下配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<tagNameFormat>V@{project.version}</tagNameFormat>
<autoVersionSubmodules>true</autoVersionSubmodules>
<username>username</username>
<password>password</password>
<branchName>develop</branchName>
<tagBase>http://ip/project/tags</tagBase>
</configuration>
</plugin>
自此,所有release插件的配置均已完成,下面开始使用,主要有以下四个命令
mvn release:clean 清理插件生成的文件等信息
mvn release:prepare 准备命令 为生成工作进行准备
mvn release:perform 实施命令 进行版本发布
mvn release:rollback 回退命令 回退本次操作
一般来说发布版本只需要 先运行 mvn release:prepare
成功后再运行release:perform
就可以了