Keep It Simple, Stupid

简单 快乐 追求

Maven-release-plugin 实践

| Comments

maven-release-plugin简介

该插件是maven自带的用于发布项目之用,比如我们用SCM的svn来管理源代码,一般会分为trunk/branches/tags三个目录。 trunk对应主线开发,一般对应的是SNAPSHOT版本,而branches可以是从trunk copy to的一个修复的小版本,也可以是从 tags copy to的一个要修复的版本,同样对应的是SNAPSHOT版本。仅有tags下面的项目的版本号定义为release。 至于maven下的release与snapshot的区别,不清楚的同学可以猛击:http://www.mzone.cc/article/277.html

官网地址: http://maven.apache.org/maven-release/maven-release-plugin/

如何用好maven-release-plugin

在实际开发中,为了方便修复bug,以及准备测试程序包。按照规范流程都需要将开发程序打包成tag,然后将程序发布出去。 那么我就经常需要从 1.0-SNAPSHOT到1.0到1.1-SNAPSHOT 这样的操作。对于项目个数比较少的情况,手动修改也未尝不可。 对于比较复杂的系统,分成了大量的服务,业务模块的,少则7,8个多者20+个。笔者在实际应用中的就是包含有20多个工程。 在没有应用release插件的时候,基本上负责发布的同学很头疼,也想办法用shell脚本去改pom的版本号。但是还是稍显麻烦。

1.0-SNAPSHOT到1.0到1.1-SNAPSHOT

SNAPSHOT是快照的意思,项目到一个阶段后,就需要发布一个正式的版本(release版本)。一次正式的发布需要这样一些工作:

在trunk中,更新pom版本从1.0-SNAPSHOT到1.0
对1.0打一个svn tag
针对tag进行mvn deploy,发布正式版本
更新trunk从1.0到1.1-SNAPSHOT

SCM

首先我们需要在POM中加入scm信息,这样Maven才能够替你完成svn操作,示例配置如下:

1
2
3
4
5
6
<scm>
  <connection>scm:svn:http://svn地址前缀部分/myapp/trunk/</connection>
  <developerConnection>scm:svn:http://svn地址前缀部分/myapp/trunk/</developerConnection>
  <url>scm:svn:http://svn地址前缀部分/myapp/trunk/</url>
</scm>
这样的配置是对应trunk下pom的配置,各个branches和tags都不一样,需要是其对于的svn地址

maven-release-plugin 应用配置

紧接着,我们需要配置maven-release-plugin,这个插件会帮助我们升级pom版本,提交,打tag,然后再升级版本,再提交,等等。配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-release-plugin</artifactId>
  <version>2.4.1</version>
  <configuration>
      <!-- mvn release:branch -DbranchName=xxx -DupdateBranchVersions=true
                      -DupdateWorkingCopyVersion=false -->
      <branchBase>http://svn地址前缀部分/myapp/branches</branchBase>
      <arguments>
          -Dmaven.test.skip=true
      </arguments>

      <!-- mvn release:perform -DautoVersionSubmodules=true -DupdateWorkingCopyVersion=false -->
      <tagBase>http://svn地址前缀部分/myapp/tags</tagBase>
      <waitBeforeTagging>10</waitBeforeTagging>
      <username>${svn.username}</username>
      <password>${svn.password}</password>
      <mavenHome>${svn.maven.home}</mavenHome>
      <scmCommentPrefix>
issue:maven-release-plugin
msg:excute maven-release-plugin
      </scmCommentPrefix>
      <autoVersionSubmodules>true</autoVersionSubmodules>
  </configuration>
</plugin>

从上面的配置可以知道,需要配置svn提交的用户名和密码以及svn安装目录,还有就是svn提交的注释(可选)。 另外在release插件打包发布到似有远程仓库的部分需要配置:

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
  <repository>
      <id>nexus</id>
      <name>Nexus</name>
      <url>http://ci仓库域名/nexus/content/repositories/releases</url>
  </repository>
  <snapshotRepository>
      <id>nexus</id>
      <name>Nexus</name>
      <url>http://ci仓库域名/nexus/content/repositories/snapshots</url>
  </snapshotRepository>
</distributionManagement>

执行、操作 Action

mvn release:prepare

执行过程中,你会遇到这样的提示:

What is the release version for “Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT”? (org.myorg:myapp) 1.0: :

——“你想将1.0-SNAPSHOT发布为什么版本?默认是1.0。”我要的就是1.0,直接回车。

What is SCM release tag or label for “Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT”? (org.myorg:myapp) myapp-1.0: :

——“发布的tag标签名称是什么?默认为myapp-1.0。”我还是要默认值,直接回车。

What is the new development version for “Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT”? (org.myorg:myapp) 1.1-SNAPSHOT: :

——“主干上新的版本是什么?默认为1.1-SNAPSHOT。”哈,release插件会自动帮我更新版本到1.1-SNAPSHOT,很好,直接回车。

然后屏幕刷阿刷,maven在build我们的项目,并进行了一些svn操作,你可以仔细查看下日志。

那么结果是什么呢?你可以浏览下svn仓库:

我们多了一个tag:https://svn-address.com/myapp/tags/myapp-1.0/ 这就是需要发布的版本1.0。 再看看trunk中的POM,其版本自动升级成了1.1-SNAPSHOT。

这不正是我们想要的么?等等,好像缺了点什么,对了,1.0还没有发布到仓库中呢。

再一次屏住呼吸,执行:

mvn release:perform

maven-release-plugin会自动帮我们签出刚才打的tag,然后打包,分发到远程Maven仓库中,至此,整个版本的升级,打标签,发布等工作全部完成。我们可以在远程Maven仓库中看到正式发布的1.0版本。

这可是自动化的 ,正式的 版本发布!

注意点

svn client的版本号,1.6的版本执行的时候需要手动确认版本号, 1.7不需要。

maven项目中的依赖其他的jar包,不能是SNAPSHOT版本的。(同时开发的项目可以用module的形式引入)。

从trunk打branches、tags以及从tags打branches、或者从branches打tags以上命令都支持,一般执行release:perform都需要先执行release:prepare.

修改trunk的版本号或者branches的版本号,可以用release:update-versions命令。

Comments