You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Pipeline执行Maven命令报错pom.xml找不到问题求助

问题原因
  • Maven执行时默认读取当前工作目录下的pom.xml,你的项目代码放在工作空间的java-maven-app-master-increment子目录,pom文件不在Jenkins任务默认的工作空间根路径,直接跑mvn命令自然会报找不到POM的错。
  • 之前试的sh "cd java-maven-app-master-increment"没用,核心原因是Jenkins Pipeline里每一个sh步骤都会启动独立的shell进程,cd操作只在当前这个sh进程里生效,进程跑完就销毁了,后面的sh命令、文件读取操作还是会回到工作空间根目录执行,等于切目录的操作根本没传到后续步骤。
修复方法

推荐用声明式Pipeline自带的dir步骤切换工作目录,这个步骤包裹的代码块里,所有操作(包括sh命令、文件读写)都会以指定目录为根路径,不容易出错。
修正后的完整流水线脚本如下:

pipeline {
    agent any
    tools {
        maven "maven-3.6"
    }
    stages {
        stage('Increment Version') {
            steps {
                // 块内所有操作都会切换到项目根目录执行
                dir('java-maven-app-master-increment') {
                    script {
                        echo 'incrementing app version...'
                        sh 'mvn build-helper:parse-version versions:set \
                            -DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion} \
                            versions:commit'
                        def matcher = readFile('pom.xml') =~ '<version>(.+)</version>'
                        def version = matcher[0][1]
                        env.IMAGE_NAME = "$version-$BUILD_NUMBER"
                    }
                }
            }
        }
        stage('Build App') {
            steps {
                dir('java-maven-app-master-increment') {
                    script{
                        echo 'Building the Application'
                        sh "mvn package"
                    }
                }
            }
        }
        stage('Deploying Step') {
            steps {
                echo 'Deploy the App'
            }
        }
    }
}

如果不想用dir步骤,也可以在所有mvn命令中加-f参数指定pom文件的相对路径,读pom文件的时候也补全路径,示例写法:

// 版本自增时指定pom路径
sh 'mvn -f java-maven-app-master-increment/pom.xml build-helper:parse-version versions:set \
    -DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion} \
    versions:commit'
// 读取文件时补全相对路径
def matcher = readFile('java-maven-app-master-increment/pom.xml') =~ '<version>(.+)</version>'
// 构建命令同样指定pom路径
sh "mvn -f java-maven-app-master-increment/pom.xml package"

这种写法需要每一处涉及项目文件的操作都手动补路径,很容易漏,优先选dir步骤的方案。

内容的提问来源于stack exchange,提问作者Zeynal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:09:33