Maven 学习笔记

第十三章 版本管理

2019-05-13  本文已影响0人  JarvisTH

版本管理指项目整体版本的演变过程管理。

版本控制指借助版本控制工具追踪代码的每个变更。

一、版本管理

版本管理关心问题之一是快照版本和发布版本的切换。

理想的发布版本项目的构建应当满足以下条件:

满足上述条件才可以将快照版本更新为发布版本。

版本控制系统记录代码的每个变化,通常这些变化被维护在主干中,当项目发布时,开发人员应该使用标签记录这一特殊时刻项目版本。

项目的快照版本更新至发布版本后,应当再执行一次Maven构建,确保项目状态健康。然后将这一变更提交到版本控制系统的主干中,接着打上标签。

二、Maven版本号定义约定

Maven版本号定义约定:
<主版本>.<次版本>.<增量版本>-<里程碑版本>

一般主版本和次版本都会声明,但增量版本和里程碑就不一定。

三、主干、标签、分支

四、自动化版本发布

Maven Release Plugin通过自动化版本发布。该插件有三个目标:



要为项目发布版本,首先需要添加正确的版本控制系统信息,一般配置项目的SCM信息:

<project>
    ...
    <scm>
        <connnection>scm:svn:http://xxxxxxx</connection>
        <developerConnection>scm:svn:https:xxxxxxx</developerConnection>
        <url>xxxx</url>
    </scm>
    ...
</project>

connection元素表示一个只读的scm地址,developerConnection元素表示可写的scm地址,url表示可在浏览器访问的scm地址。为了让Maven识别,connection和developerConnection必须以scm开头,冒号之后部分表示版本控制类型。然后是scm地址。

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

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

执行release:prepare之前要注意:第一,系统必须提供svn命令行工具;第二,POM必须配置了可用的部署仓库,因为release:perform会执行deploy将构建发布到仓库。

就绪后在项目的根目录下运行:mvn release:prepare 。
如果顺利,则会提示输入想要发布的版本号、标签名称及最新的快照版本号。

在多模块项目中执行release:prepare时,默认提示设定每个模块发布版本号及新的开发版本号。maven-release-plugin提供autoVersionSubmodules参数,避免重复确认:mvn release -DautoVersionSubmodules=true 。

如果release:prepare结果没问题,执行发布命令:mvn release:perform。该命令将标签的代码签出,执行mvn deploy命令构建,并部署仓库。基于该主构建的-source.jar和-javadoc.jar也会生成并发布。

在超级POM中定义了一个名为release-profile的Maven Profile,Profile指一段在特定情况下被激活并更改Maven行为的配置。在只需release:perform时,Maven Release Plugin会自动生成值为true的performRelease属性,导致超级POM中的release-profile被激活。

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

五、自动化创建分支

maven Release plugin的branch目标,自动化分支操作:

必须在POM中提供正确的scm信息,由于分支操作涉及版本控制系统的分支地址,还要为Maven Release Plugin配置分支基础目录。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.0</version>
    <configuration>
        <tagBase>xxxxx/xx/tags/</tagBase>
        <branchBase>xxxxxx/xxx/branches/</branchBase>
    </configuration>
</plugin>

如果为版本控制仓库使用了标准的Subversion布局,即在平行的trunk/tags/branches目录下分别分支项目主干代码、标签代码和分支代码,那么插件能自动计算出标签及分支代码位置,因此可以省略配置tagBase和branchBase。

运行命令创建分支:mvn release:branch -DbranchName=1.1.x \ -DupdataBranchVersions=true -DupdateWorkingCopyVersions=false。

DbranchName配置创建的分支名称,DupdataBranchVersions配置分支使用新版本,DupdateWorkingCopyVersion=false表示不更新本地代码的版本。运行后会提示输入分支项目版本。

六、GPG及其基本使用

Gnu PG(GPG)是PGP标准的一个免费实现,跨平台,为文件生成签名、管理密匙以及验证签名等。

先下载安装,可以手动签名,也可以使用插件。

Maven GPG Plugin自动化签名工作。使用插件前必须确认命令行下gpg可用。然后配置pom:



然后使用mvn命令签名并发布构件:mvn clean deploy -Dgpg.passphrass=yourpassphrass 。

如果想对已发布但没有签名的文件签名发布:


GPG签名只有在项目发布时必要,日常构件意义不大。判断项目是否要发布借助超级POM的release-profile的performReleasse值为true时,就是项目发布时刻,可以在settings.xml或POM中设置:


release:perform执行过程中签名可能会导致进程永久挂起,需要提供mavenExecutorId配置:


上一篇 下一篇

猜你喜欢

热点阅读