版本管理指项目整体版本的演变过程管理。
版本控制指借助版本控制工具追踪代码的每个变更。
一、版本管理
版本管理关心问题之一是快照版本和发布版本的切换。
理想的发布版本项目的构建应当满足以下条件:
满足上述条件才可以将快照版本更新为发布版本。
版本控制系统记录代码的每个变化,通常这些变化被维护在主干中,当项目发布时,开发人员应该使用标签记录这一特殊时刻项目版本。
项目的快照版本更新至发布版本后,应当再执行一次Maven构建,确保项目状态健康。然后将这一变更提交到版本控制系统的主干中,接着打上标签。
二、Maven版本号定义约定
Maven版本号定义约定:
<主版本>.<次版本>.<增量版本>-<里程碑版本>
一般主版本和次版本都会声明,但增量版本和里程碑就不一定。
三、主干、标签、分支
四、自动化版本发布
Maven Release Plugin通过自动化版本发布。该插件有三个目标:
<connnection>scm:svn:http://xxxxxxx</connection> <developerConnection>scm:svn:https:xxxxxxx</developerConnection> <url>xxxx</url> </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版本
将POM中的scm信息更新为分支地址
提交以上更改
将主干代码复制的分支中
修改本地代码使其回退到分之前的版本
提交本地更改
必须在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: