之前我发布了一个关于如何从命令行更改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,请检查这个答案。
只是为了记录,可以直接在命令行中配置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执行而被重写。