Administrator
Administrator
发布于 2023-10-27 / 112 阅读
0
0

版本控制之maven-release-plugin插件使用

说明

在上一篇文章——maven发布jar到中央仓库 里分享了关于如何发布maven构件到中央仓库的文章。通常这样的需求是我们在准备为开源社区做贡献时产生的,因此几乎绝对伴随着项目的版本迭代和发布计划。

试想一下这个场景:你维护了一个开源项目,当前版本是0.0.1-SNAPSHOT,并且0.0.1已经开发完毕,你打算发布0.0.1正式版本到maven私服。于是,你把pom.xml文件中的project.version由0.0.1-SNAPSHOT改成了0.0.1, 然后执行了mvn clean deploy, 发布到了maven中央仓库(假如你的项目已经做好了发布maven中央仓库的就绪准备),发布成功后,你需要提交代码,并基于0.0.1发布时的代码打一个tag,然后将代码推送到github。最后,你还需要将project.version改成0.0.2-SNAPSHOT, 以便进行下一个小版本的开发。

上面的流程是否繁琐?你可能觉得还好,毕竟发版本不是太频繁的事。但是!但是!但是!如果你是多模块项目呢?比如你的父parent下有10个模块,可能有些模块下还有七八个模块,更普遍存在的是,模块之间存在dependency引用,这个要改版本号就比较麻烦了,虽然idea可以全局批量,但是加上发布、推送、打tag, 改版本号,这些操作全部人工来做,也容易出错。

因此,maven-release-plugin的作用就出来了!是的,它几乎就是上面人肉步骤的自动化而已,做的事儿还是那些,步骤和原理也大差不差。只是让开发者只需要执行一两个命令就够了。

步骤

pom.xml 配置

点击这里查看我的pom.xml文件。重点关注其中的以下几个部分:

  1. licenses
  2. scm
  3. distributionManagement
  4. maven-release-plugin 插件的配置

其中licenses、scm、distributionManagement这几个部分是发布中央仓库所必须的,其实跟maven-release-plugin插件关系倒不大。

执行 release:prepare

image-1698713510433

此命令执行后,会在终端交互式让你输入要发布的版本号(比如0.0.1),项目打的tag号(0.0.1)、以及发布成功后的下一个开发版本号(0.0.2-SNAPSHOT)。
然后会把项目里的版本号全部换成要发布的版本号,并检查依赖中不能有SNAPSHOT版本之类的,然后执行install, 并应用gpg加密,然后将代码提交。

执行 release:perform

image-1698713544115

此命令会将上一步打包的构件(jar),发布到中央仓库(假如你配的是发布到中央仓库),并将版本改为下一个开发版本号,并提交、推送到remote。

插件命令介绍

插件的具体介绍就直接看maven-release-plugin 官网介绍吧,二手的资料没意义。

踩坑

  1. 由于我的项目是多模块,而且parent和子模块是同一级的(目录结构不是父子级),导致我在使用maven-release-plugin执行release:perform时总是报如下错误:
Caused by: org.apache.maven.plugin.MojoFailureException: Unable to tag SCM
Provider message:
The git-push command failed.
Command output:
ERROR: Repository not found.
fatal: Could not read from remote repository.

这个错误极具误导性,让我始终觉得是scm里地址写错了,或者git权限没读到。折腾了很久,直到看到这篇文章:maven-release-plugin “Unable to tag SCM” Issue And Solution, 才知道是项目结构出了问题,多模块时,子模块都必须在父pom下。调整好目录结构后,问题迎刃而解。

参考

  1. maven-release-plugin “Unable to tag SCM” Issue And Solution
  2. Maven Release Plugin

评论