在 Jenkins 上,Maven 忽略我在同一管道中设置的环境变量 MAVEN_OPTS 和 MAVEN_ARGS。这是我使用的代码:
pipeline {
agent {
docker {
image 'iubar-maven-alpine'
label 'docker'
args '-v ${HOME}/.m2:/home/jenkins/.m2:rw,z'
}
}
environment {
MAVEN_ARGS = '--show-version --batch-mode'
MAVEN_OPTS = '-Djava.awt.headless=true'
}
stages {
stage ('Build') {
steps {
sh 'mvn clean compile'
}
}
...
所以为了解决我需要写的问题:
...
stage ('Build') {
steps {
sh 'mvn $MAVEN_ARGS $MAVEN_OPTS clean compile'
}
}
...
造成这种行为的原因是什么?还有更好的解决办法吗?
造成这种行为的原因是什么?
Maven 仅从版本 3.9.0 开始支持
MAVEN_ARGS
环境变量。顺便说一句,它还允许指定目标,而不仅仅是标志。
当您运行像 sh 'mvn $MAVEN_ARGS $MAVEN_OPTS clean compile
这样的命令时它对您有用的原因是因为您在
mvn
之后放置了一个环境变量- 所以您的 shell 将它们作为参数插入到命令中。如果您将环境变量放在
mvn
调用之前,则预期结果将与您在 Jenkinsfile 的 environment
块中定义它们时的结果相同。
还有更好的解决方案吗?
只需更新您的 Maven 版本即可。您最初的方法是规范的方法。我用 Maven 3.8.8 和 3.9.6 确认了这种行为。
另外,请记住,Maven 不仅可以从您使用的环境变量中获取配置,还可以从
settings.xml
以及位于 .mvn
目录中的配置文件获取配置。