之前我发布了一个关于如何从命令行更改Maven项目版本的问题,这导致我遇到了一个新问题。

以前我能够获得版本号,因为版本存储为一个属性,很容易从命令行(bash)进行grep和解析。现在pom.xml <version>元素用于此,它不再是唯一的,因为所有依赖项(也许其他一些依赖项也使用它)。我认为,如果没有用于解析XML的外部工具或一些非常能感知上下文的sed命令,就无法用bash脚本获得当前版本号。

在我看来,最干净的解决方案是Maven发布这个版本信息。我想写一个自定义的maven插件检索不同的属性,但我想我应该先问这里。

那么,是否有任何简单的方法来获取${project的值。版本}到命令行?

解决方案

我必须手动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)

当前回答

这是上面的编辑

油漆pom . xml | grep " |头-n 1 | sed e, s -版/ g”| sed -e "s/\s*[<>/]*/ g"

我在cmdline上测试了一下,效果很好

grep " pom . xml |头-n 1 | sed e, s -版/ g”| sed e,“s / \ s * [< > /] * / / g

是同一事物的另一个版本。我需要在没有安装mvn的情况下在Jenkins CI中获得k8s的版本号,所以这是最有帮助的

谢谢所有。

其他回答

Maven帮助插件已经为此提出了一些建议:

help:evaluate以交互模式计算用户给出的Maven表达式。

下面是你如何在命令行上调用它来获得${project.version}:

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
    -Dexpression=project.version

正如Seb T的注释中所指出的,要只打印没有maven INFO日志的版本,另外使用-q -DforceStdout:

mvn help:evaluate -Dexpression=project.version -q -DforceStdout
mvn help:evaluate -Dexpression=project.version | sed -e 1h -e '2,3{H;g}' -e '/\[INFO\] BUILD SUCCESS/ q' -e '1,2d' -e '{N;D}' | sed -e '1q'

我只是添加了一个小的sed过滤器改进,我最近实现了提取项目。来自maven输出的版本。

应该更容易,因为这个错误在maven-help-plugin 3.0.0中得到了修复:MPH-99 Evaluate在安静模式下没有输出。

VERSION=$(mvn -version | grep 'Apache Maven' | grep -o '[0-9].[0-9].[0-9]')
echo $VERSION

要么让mvn给出答案(正如大多数答案所建议的那样),要么从pom.xml中提取答案。第二种方法的唯一缺点是可以很容易地提取<version/>标记的值,但只有当它是文字时,即不是Maven属性时,它才有意义。我选择了这种方法,因为:

mvn太啰嗦了,我只是不喜欢过滤它的输出。 与读取pom.xml相比,启动mvn非常慢。 我总是在<version/>中使用文字值。

Mvn-version是一个ZSH shell脚本,它使用xmlstarlet读取pom.xml并打印项目的版本(如果存在)或父项目的版本(如果存在):

$ mvn-version .
1.0.0-SNAPSHOT

优点是它比运行mvn快得多:

$ time mvn-version .
1.1.0-SNAPSHOT
mvn-version .  0.01s user 0.01s system 75% cpu 0.019 total

$ time mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
> -Dexpression=project.version
mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate   4.17s user 0.21s system 240% cpu 1.823 total

我的机器上的差异超过两个数量级。