Maven:自动化版本发布。

当熟悉了版本发布流程之后,就会希望借助工具将这一流程自动化。Maven Release Plugin就提供了这样的功能,只要提供一些必要的信息,他就能帮我们完成上述所有版本发布所涉及的操作。下面介绍如何使用Maven Release Plugin发布项目版本。

Maven Release Plugin主要有三个目标,他们分别为:

release:prepare        准备版本发布,依次执行下列操作:

  • 检查项目是否有未提交的代码。
  • 检查项目是否有快照版本依赖。
  • 根据用户的输入将快照版本升级为发布版。
  • 将POM中的SCM信息更新为标签地址。
  • 基于修改后的POM执行Maven构建。
  • 提交POM变更。
  • 基于用户输入为代码打标签。
  • 将代码从发布版升级为新的快照版。
  • 提交POM变更。

release:rollback    回退release:prepare所执行的操作。将POM回退至release:prepare之前的状态,并提交。需要注意的是,该步骤不会删除release:prepare生成的标签,因此用户需要手动删除。

release:perform        执行版本发布。签出release:prepare生成的标签的源代码,并在此基础上执行mvn deploy命令打包并部署构件至仓库。

要为项目发布版本,首先需要为其添加正确的版本控制系统信息,这是因为Maven Release Plugin需要知道版本控制系统的主干、标签等地址信息后才能执行相关的操作。一般配置项目的SCM信息如下所示。

<project>
...
    <scm>
        <connection>scm:svn:http://192.168.1.103/app/trunk</connection>
        <developerConnection>scm:svn:http://192.168.1.103/app/trunk</developerConnection>
        <url>http://192.168.1.103/project1/trunk</url>
    </scm>
...
</project>

上述代码中connection元素表示一个只读的scm地址,而developerConnection元素表示可写的scm地址,url则表示可以在浏览器中访问的scm地址。为了能让Maven识别,connection和developerConnection必须以scm开头,冒号之后的部分表示版本控制工具类型(这里是svn),Maven还支持cvs、git等。接下来才是实际的scm地址,该例中的connection使用了http协议,而developerConnection则由于涉及操作,使用https协议进行了保护。

该配置只告诉Maven当前代码的位置(主干),而版本发布还要涉及标签操作。因此,还需要配置Maven Release Plugin告诉其标签的基础目录,如下所示。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.0</version>
    <configuration>
        <tagBase>https://192.168.1.103/app/tags/</tagBase>
    </configuration>
</plugin>

在执行release:prepare之前还有两个注意点:第一,系统必须要提供svn命令行工具,Maven需要svn命令行工具执行相关操作,而无法使用图形化的工具,如TortoiseSVN;第二,POM必须配置了可用的部署仓库,因为release:perform会执行deploy操作将构件发布到仓库中。

一切就绪之后,在项目根目录之后,在项目根目录下运行如下命令:

$ mvn release:prepare

Maven Release Plugin开始准备发布版本,如果他检测到项目有未提交的代码,或者项目有快照版的依赖,则会提示出错。如果一切都问题,则会提示用户输入想要发布的版本号、标签的名称以及新的快照版本号。

如果项目的artifactId为app,发布前的版本为1.0.0-SNAPSHOT,则Maven Release Plugin会提示使用发布版本号1.0.0,使用标签名称app-1.0.0,新的开发版本为1.0.1-SNAPSHOT。如果这些模式值正是你想要的,直接按Enter键即可,否则就输入想要的值再按Enter键。

基于这些信息,Maven Release Plugin会将版本从1.0.0-SNAPSHOT更新为1.0.0,并更新SCM地址http://192.168.1.103/app/trunk至http://192.168.1.103/app/tags/app-1.0.0。在此基础上运行一次Maven构件以防止意外的错误出现,然后将这两个变化提交,并为该版本打上标签,标签地址是http://192.168.1.103/app/tags/app-1.0.0。即tagBase路径加上标签名称。之后,Maven Release Plugin会将POM中的版本信息从1.0.0升级到1.0.0-SNAPSHOT并提交。

至此,release:prepare的工作完成。如果这时你发现了一些问题,例如将标签名称配置错了,则可以使用release:rollback命令回退发布,Maven Release Plugin会将POM的配置回退到release:prepare之前的状态。但需要注意的是,版本控制系统中的标签并不会被删除,也就是说,用户需要手动执行版本控制系统命令删除该标签。


在多模块项目中执行replease:prepare的时候,默认maven-release-plugin会提示用户设定每个模版发布版本及新的开发版本号。
在很多情况下,我们会希望所有模块的发布版本以及新的SNAPSHOT开发版本都保持一致。为了避免重复确认,maven-release-plugin提供了autoVersionSubmodules参数。例如运行下面的命令后,maven-release-plugin就会自动为所有子模块使用与父模块一致的发布版本和新的SNAPSHOT版本:

$ mvn release:prepare -DautoVersionSubmodules=true

如果检查下来release:prepare的结果没有问题,标签和新的开发版本都是正确的,可以执行如下发布执行命令:

$ mvn release:perform

该命令将标签中的代码签出,执行mvn deploy命令构建刚才准备的1.0.0版本,并部署到仓库中。至此,版本1.0.0正式发布完成。由于他已经被部署到了Maven仓库中,其他人可以方便的配置对他的依赖。

如果你所发布项目的打包类型为jar,在执行release:perform之后,不仅项目的主构件会被生成并发布到仓库中,基于该主构件的-sources.jar和-jarvadoc.jar也会生成并发布。对于你的用户来说,这无疑是非常方便的,他们不仅能够下载你的主构件,还能够得到项目的源码和Javadoc.那么,release:perform是怎样生成-sources.jar和-jarvadoc.jar的呢?

所有Maven项目的POM都继承自超级的POM,而如果打开超级POM,就能发现如下所示内容。

<profiles>
    <profile>
        <id>release-profile</id>
        <activation>
            <property>
                <name>performRelease</name>
                <value>true</value>
            </property>
        </activation>
        
        <build>
            <plugins>
                <plugin>
                    <inherited>true</inherited>
                    <artifactId>maven-source-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>attach-sources</id>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <inherited>true</inherited>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>attach-javadocs</id>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <inherited>true</inherited>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <configuration>
                        <updateReleaseInfo>true</updateReleaseInfo>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

超级POM中定义了一个名为release-profile的Maven Profile,Profile是指一段在特定情况下被激活并更改Maven行为的配置。这里看到activation元素下有一个名为performRelease、值为true的属性配置,这表示当Maven运行时,如果运行环境中有performRelease、值为true的属性配置,这表示当Maven运行时,如果运行环境中有performRelease属性且值为true的时候,该Profile就被激活。也就是说,该Profile下的配置会得到应用。那么,什么情况下Maven运行环境中会有名为performRelease、值为true的属性呢?可以在命令行指定。例如:

$ mvn clean install -DperformRelease=true

但是,在执行release:perform的时候,Maven Release Plugin会自动生成值为true的performRelease属性。这时,超级POM中的release-profile就会被激活。

这个Profile配置了3个Maven插件,maven-sources-plugin的jar目标会为项目生成-source.jar文件,maven-javadoc-plugin的jar目标会为项目生成-javadoc.jar文件,而maven-deploy-plugin的update-release-info配置则会在部署的时候更新仓库中的元数据,告诉仓库该版本是最新的发布版。每个插件配置中值为true的inherited元素则表示该插件配置可以被子POM继承。

在日常的快照开发过程中,往往没有必要每次都生成-source.jar和-jarvadoc.jar,但是当项目发布的时候,这些文件就显得十分重要。超级POM中的release-profile就是为了这种情形而设计的。需要注意的是,这种隐式的配置对于不熟悉Maven的用户来说可能会显得十分令人费解,因此将来的Maven版本中可能会从超级POM中移除这段配置,所以如果用户希望在发布版本时自动生成-sources.jar和-jarvadoc,最好还是在自己的POM中显式的配置这些插件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值