Maven release plugin 心得
说到Maven 和 Maven 相关的Plugin, 有很多大家耳熟能详的. 但是跟项目发布相关的插件, 首推maven release plugin, 省心太多!
为什么要用它?
如果项目中需要发布一些外部系统所依赖的包, 那么应该有如下几步:
- 把版本号后面的SNAPSHOT去掉(SNAPSHOT是可以被重复覆盖的), 向maven私服发布一个稳定版本;
- 需要在git上面建立tag, 作为release的milestone;
- 为下一个迭代进行SNAPSHOT版本的准备.
如果人肉去做这几件事情, 会很烦还容易出错. maven release plugin 就是帮我们做这几件事情的. 他还会额外帮助我们做:
- 检查项目中所有的外部依赖包, 是否包含SNAPSHOT;
- 检查是否有未提交的代码;
- 运行单元测试, 确保全部通过.
使用说明
一般来说引入maven release plugin需要如下几步:
- 在项目的pom文件中(如果是multi-module的只需要在主Pom中添加), 增加
和 , 无需添加mvn-release-plugin的依赖, 因为它默认被包含于maven的effective pom中; - 检查自己的maven settings.xml是否包含了私服的用户名密码;
- 确保自己本地代码是在主分支, 并且是最新的副本, 否则后果自负;
- 执行 mvn release:prepare, 这时插件会扫描项目依赖查看是否有SNAPSHOT, 是否存在未提交的文件, 确定当前release的版本号和下一个迭代的版本号, 插件会运行单元测试, 并向git中提交两次commit, 一次是release版本, 一次是下一个迭代的版本. 并将当前release版本打一个tag并提交到git上面去;
- 执行 mvn release:perform, 插件会执行mvn deploy 操作, 并clean掉生成的缓存文件.
so easy, 顺利的进行完成后, 你就会发现, 项目已经顺利的从 1.0-SNAPSHOT 变成了 1.0.1-SNAPSHOT. 并且 1.0 版本已经在git的tag和maven的私服上面了. 大功告成!
执行mvn release:prepare之后, git log
commit ff
Author: jack.zhang <jack.zhang@xxx.com>
Date: Tue Aug 25 17:45:56 2015 +0800
[maven-release-plugin] prepare for next development iteration
commit be
Author: jack.zhang <jack.zhang@xxx.com>
Date: Tue Aug 25 17:45:50 2015 +0800
[maven-release-plugin] prepare release project-1.0.1
pom文件中的设置
<distributionManagement>
<repository>
<id>releases</id>
<name>xxxx internal releases repository</name>
<url>http://xxx.com/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>xxxx internal snapshots repository</name>
<url>http://xxx.com/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<scm>
<url>http://xxx.com/project</url>
<connection>scm:git:git@xxx.com/project.git</connection>
<developerConnection>scm:git:git@xxx.com/project.git</developerConnection>
<tag>HEAD</tag>
</scm>
可能出现的问题与解决方案
一般情况下, 如果出现任何的build失败的情况, 请仔细查阅maven日志, 无非是以下几种情况
- 依赖项中版本带SNAPSHOT;
- 单元测试未通过;
- scm或者distributionManagement 没有在pom中进行配置;
- mvn release: perform 返回400;
- 代码改动没有merge;
- 不想升级了.
出现这些情况不要慌, 如果没有执行mvn release:perform, 那么改动是不会真正发布到maven私服上面的, 可以通过 mvn release:rollback, 进行回退处理.
如果还不行那么最简单的方案就是 mvn release:clean , git clean -fd, 会清除一切的maven插件产生的中间文件
如果是mvn release:perform时出现400问题, 那么检查一下你的私服的用户名密码是否在maven settings.xml中配置正确, 再检查一下当前release的版本是否在私服上已经有了.