事实上,Maven 不能在一次运行中更改它自己项目的版本与其他目标。最重要的是,据我所知,Maven 不支持<version>
标签中的任意属性。因此,需要单独执行来运行将更改 POM 版本的目标。有各种插件可以做到这一点 - 对于这种情况,可能会使用插件中的versions:set
目标versions
- http://mojo.codehaus.org/versions-maven-plugin/set-mojo.html
因此,可以按如下方式执行它,例如:
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT
其中$branch
变量必须包含当前 Git 分支名称;它可以用 提取git rev-parse
,如下所示:
branch=$(git rev-parse --abbrev-ref HEAD)
但是,仍然需要以某种方式执行它。你可以手动做,但是很麻烦。所以,我的猜测是,确实最强大的解决方案是从 Git 方面解决这个问题。那就是——一个 Git 钩子。这是完成这项工作的完整 Gitpost-checkout
钩子(与上面的代码相同,只是在签出分支时运行钩子,而不是单个文件):
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
version=$branch-SNAPSHOT
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
将此内容放入文件PROJECTDIR\.git\hooks\post-checkout
文件中。请注意,挂钩文件应该是可执行的以运行它(chmod +x post-checkout
)。
关于versions
插件的一些注意事项 - 它非常灵活并且支持许多选项并且几乎没有其他可能有帮助的目标,具体取决于您的项目结构(您是否使用父 pom,孩子是否有自己的版本或者它们是否来自父, ETC。)。因此,可以通过使用versions
插件中的其他目标或指定其他参数来稍微修改上面的钩子以支持您的特定情况。
优点:
- 强大的
- 无需更改 pom.xml 文件本身中的任何内容即可完成此工作
- 只需停用挂钩(删除或使其不可执行)即可关闭此“功能” - 同样,不需要在 pom.xml 中进行任何更改
缺点:
- 不能强制其他人使用钩子——它应该在克隆 repo 后手动安装(或者,如果假设的 Git 用户害怕接触 .git 目录中的东西,你可以提供一个脚本来安装钩子)。
更新
之后是更复杂的钩子版本,它不仅会将版本设置为分支名称,还会保留旧版本的后缀。例如,提供旧版本master-1.0-SNAPSHOT
,切换到feature1
分支会将项目的版本更改为feature1-1.0-SNAPSHOT
. 这个 bash 脚本存在一些问题(需要名称中没有短划线符号 ( -
) 的分支名称,并且只采用根 pom 的版本),但可以了解如何扩展钩子:给定 mvn 和bash 命令可以提取和更新 POM 中的大量信息。
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
# get current version of the top level pom
current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*')
# extract version suffix
suffix=$(echo $current_version | cut -d \- -f 2)
# build new version
version=$branch-$suffix
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'