【发布时间】:2011-04-02 11:56:37
【问题描述】:
之前我在how to change Maven project vesion from command line 上发布了一个问题,这导致我遇到了一个新问题。
以前我能够获得版本号,因为版本被存储为一个易于从命令行 (bash) 进行 grep 和解析的属性。现在 pom.xml <version> 元素用于此,它不再是唯一的,因为所有依赖项,也许其他一些依赖项也使用它。我认为没有办法使用 bash 脚本获取当前版本号没有用于解析 XML 的外部工具或一些非常上下文感知的 sed 命令。
我认为最干净的解决方案是让 Maven 分发此版本信息。我正在考虑编写一个自定义 maven 插件来检索不同的属性,但我想我会先在这里问。
那么,有没有什么简单的方法可以将${project.version} 的值传到命令行呢?
解决方案
我不得不手动 cd 到目录,但这很容易做到。在我的 bash 脚本中,我有:
version=`cd $project_loc && mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | sed -n -e '/^\[.*\]/ !{ /^[0-9]/ { p; q } }'`
这为我提供了当前版本,然后我可以升级。 Grepping 可能更简单,但我认为我希望尽可能健壮,所以我对以数字开头的第一行感到满意,并尝试将其作为版本号处理。
# Advances the last number of the given version string by one.
function advance_version () {
local v=$1
# Get the last number. First remove any suffixes (such as '-SNAPSHOT').
local cleaned=`echo $v | sed -e 's/[^0-9][^0-9]*$//'`
local last_num=`echo $cleaned | sed -e 's/[0-9]*\.//g'`
local next_num=$(($last_num+1))
# Finally replace the last number in version string with the new one.
echo $v | sed -e "s/[0-9][0-9]*\([^0-9]*\)$/$next_num/"
}
我通过简单地调用来使用它:
new_version=$(advance_version $version)
【问题讨论】:
-
解决方案似乎缺少一个 ' 来完成 sed 表达式。
-
哪个 sed exp?我似乎没有注意到。
-
将其设为 mvn -o 以加快执行速度
-
你可以用简单的
grep -e '^[[:digit:]]'替换那个复杂的sed表达式 -
如果您按照@NathanBubna 的建议使用 -o ,那么这将使 maven 处于“离线”模式。如果您还没有下载 maven 帮助插件和相关 jar,那么构建将失败。被烧了一点,希望它可以帮助别人。
标签: bash command-line maven-2