用Maven进行项目版本号维护的小结

maven-release-plugin V.S. versions-maven-plugin

Posted by S.L on October 9, 2018

开发项目的时候,jar包版本管理是一件很重要的事情。如果某个jar的snapshot版本被使用到了线上,这个jar的SNAPSHOT版本又经常更新,那线上的工程可能就遭殃了,今天发布好好的,明天发布又不行了。因此线上我们一定要使用release版本,下面我们来了解下maven对版本的管理。

进行较大项目开发时会涉及到项目管理的问题,一般都是采用Maven对Java项目进行管理,非常的方便。 目前常用的插件有两个:versions-maven-plugin和maven-release-plugin。

versions-maven-plugin

这个plugin比较简单,就是可以在父子项目中可以用命令直接修改对应的version不必一个一个去修改。

修改

mvn versions:set -DnewVersion=1.0.1-SNAPSHOT

执行完会生成pom.xml.versionsBackup备份文件

撤销回滚

mvn versions:commit
mvn versions:revert

使用起来非常灵活,但是缺点就是需要人工去维护版本号,可能容易出错。发布的话需要我们自己去打tag,比较麻烦。

maven-release-plugin

为什么要用它?

如果项目中需要发布一些外部系统所依赖的包, 那么应该有如下几步:

1.把版本号后面的SNAPSHOT去掉(SNAPSHOT是可以被重复覆盖的), 向maven私服发布一个稳定版本; 2.需要在git上面建立tag, 作为release的milestone; 3.为下一个迭代进行SNAPSHOT版本的准备.

该插件不但避免了人工操作可能出错的风险还会额外帮助我们做:

  • 1.检查项目中所有的外部依赖包, 是否包含SNAPSHOT;
  • 2.检查是否有未提交的代码;
  • 3.运行单元测试, 确保全部通过.

这个插件是用来对项目进行发包操作的,它利用POM中的version标签进行自动的版本号管理

  • 将当前SNAPSHOT包进行去SNAPSHOT后提交一个commit到git
  • 将当前release版本号进行最小位置加1后增加-SNAPSHOT后缀后提交一个commit

该插件通过scm标签进行版本号的维护,每次release后都会对当前项目打一个tag后保存到git上。

Command

mvn -B -U -DignoreSnapshots=true release:clean release:prepare release:perform

初始化标签

    <scm>
        <connection>scm:git:git@git.xx.com:rd/project-name.git</connection>
        <developerConnection>scm:git:git@git.xx.com:rd/project-name.git
        </developerConnection>
        <tag>HEAD</tag>
    </scm>

第一次commit修改

tag改为对应POM版本号的release版本号,如默认为project-name-1.0-SNAPSHOT,则release版本为project-name-1.0

    <scm>
        <connection>scm:git:git@git.xx.com:rd/project-name.git</connection>
        <developerConnection>scm:git:git@git.xx.com:rd/project-name.git
        </developerConnection>
        <tag>project-name-1.0</tag>
    </scm>

版本号改为

1.0

对应的commit为

[maven-release-plugin] prepare release project-name-1.0

第二次commit修改

tag改回HEAD

    <scm>
        <connection>scm:git:git@git.xx.com:rd/project-name.git</connection>
        <developerConnection>scm:git:git@git.xx.com:rd/project-name.git
        </developerConnection>
        <tag>HEAD</tag>
    </scm>

版本号改为

1.1-SNAPSHOT

对应的commit为

[maven-release-plugin] prepare for next development iteration

上线

一般公司都采用Jenkins进行线上服务的构建和发布,在通过Maven对项目进行构建完毕后就可以发包了。如果使用maven-release-plugin 进行打包的话,根据上面的说明,最新的version其实是SNAPSHOT,如果我们直接使用最新代码进行打包则将SNAPSHOT包发布到了线上!

所以正确的方式是使用上一步搭好的release的tag进行部署,如我们已经打好的1.0的tag:

[maven-release-plugin] copy for tag project-name-1.0

参考

  • http://zhwbqd.github.io/2015/08/25/maven-release-plugin.html
  • http://maven.apache.org/maven-release/maven-release-plugin/

本文首次发布于 S.L’s Blog, 作者 @stuartlau ,转载请保留原文链接.