之前我发布了一个关于如何从命令行更改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)

当前回答

这是最干净的解决方案:

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

优点:

这在所有操作系统和所有shell上都可以正常工作。 不需要任何外部工具! [重要]即使项目版本从父pom.xml继承,这也有效

注意:

maven-help-plugin 3.2.0(及以上版本)有强制输出选项。您可以从artifactory的mvn-help-plugin可用版本列表中替换上述命令中的3.2.0,如果可用的话。 选项-q抑制详细消息([INFO], [WARN]等)

或者,你可以在你的pom.xml中添加这个条目,在插件部分下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-help-plugin</artifactId>
    <version>3.2.0</version>
</plugin>

然后按如下简洁地运行上述命令:

mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout

如果您还想获取groupId和artifactId,请检查这个答案。

其他回答

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

在我的特拉维斯工作期间,我需要的正是这个要求,但有多个值。 我从这个解决方案开始,但当调用多次这是非常缓慢的(我需要5个表达式)。

我写了一个简单的maven插件来将pom.xml的值提取到.sh文件中。

https://github.com/famaridon/ci-tools-maven-plugin

mvn com.famaridon:ci-tools-maven-plugin:0.0.1-SNAPSHOT:environment -Dexpressions=project.artifactId,project.version,project.groupId,project.build.sourceEncoding

会产生:

#!/usr/bin/env bash
CI_TOOLS_PROJECT_ARTIFACTID='ci-tools-maven-plugin';
CI_TOOLS_PROJECT_VERSION='0.0.1-SNAPSHOT';
CI_TOOLS_PROJECT_GROUPID='com.famaridon';
CI_TOOLS_PROJECT_BUILD_SOURCEENCODING='UTF-8';

现在您可以简单地获取该文件的源代码

source .target/ci-tools-env.sh

玩得开心。

只是为了记录,可以直接在命令行中配置Maven的Simple SLF4J日志记录,只输出我们需要的配置:

org.slf4j.simpleLogger.defaultLogLevel =警告和 org.slf4j.simpleLogger.log.org.apache.maven.plugins.help =信息

详见http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html

MAVEN_OPTS="\
-Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO" \
mvn help:evaluate -o -Dexpression=project.version

因此,可以简单地运行tail -1并得到:

$ MAVEN_OPTS="\
-Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO" \
mvn help:evaluate -o -Dexpression=project.version | tail -1

1.0.0-SNAPSHOT

注意,这是一行程序。MAVEN_OPTS仅为这个特定的mvn执行而被重写。

为什么不使用正确的工具呢?使用xpath语法是检索版本号的最佳方法,因为它是访问XML数据结构的预期方法。下面的表达式使用元素的“本地名称”遍历pom,换句话说,忽略xml中可能存在也可能不存在的名称空间声明。

xmllint --xpath "//*[local-name()='project']/*[local-name()='version']/text()" pom.xml

这是最干净的解决方案:

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

优点:

这在所有操作系统和所有shell上都可以正常工作。 不需要任何外部工具! [重要]即使项目版本从父pom.xml继承,这也有效

注意:

maven-help-plugin 3.2.0(及以上版本)有强制输出选项。您可以从artifactory的mvn-help-plugin可用版本列表中替换上述命令中的3.2.0,如果可用的话。 选项-q抑制详细消息([INFO], [WARN]等)

或者,你可以在你的pom.xml中添加这个条目,在插件部分下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-help-plugin</artifactId>
    <version>3.2.0</version>
</plugin>

然后按如下简洁地运行上述命令:

mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout

如果您还想获取groupId和artifactId,请检查这个答案。