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

使用ProcessBuilder执行mvn命令报错:找不到指定文件

问题描述

尝试通过Groovy执行mvn命令,代码如下:

def mvnPath = System.getenv("MAVEN_HOME") + "/bin/mvn"
def pomPath = new File("./pom.xml").getAbsolutePath()
Process mavenPrimaryPackagingProcess = new ProcessBuilder(
        "${mvnPath} primary-package -Pfull-release -f ${pomPath}"
    )
    .directory(new File("."))
    .redirectOutput(ProcessBuilder.Redirect.INHERIT)
    .start()

运行时抛出异常:

Exception in thread "main" java.io.IOException: Cannot run program "c:\Maven\maven-3.8.4/bin/mvn primary-package -Pfull-release -f D:\projectRoot.\pom.xml" (in directory "."): CreateProcess error=2, Le fichier spécifié est introuvable

(注:"Le fichier spécifié est introuvable"为法语,意为“系统找不到指定的文件”)

已知mvn可执行文件和pom.xml均为绝对路径,代码通过命令行java -jar ...执行,终端当前目录为D:\projectRoot(与new File(".")输出目录一致),请问问题出在哪里?

问题原因及解决方案
  • 核心问题:ProcessBuilder参数传递错误
    ProcessBuilder构造方法如果传入单个拼接字符串,会把整个内容当作可执行文件的完整路径,而非“命令+参数”的组合。你的代码把mvn路径、命令参数全部拼在一起,导致系统试图寻找一个包含参数的超长文件名,这显然不存在,这就是报错的根本原因。

  • 次要问题:路径细节优化

    • Windows系统路径分隔符为\,你用了/虽然能兼容,但更规范的写法是用File.separator;
    • pomPath生成的路径出现D:\projectRoot.\pom.xml,多余的.来自./pom.xml的解析,虽然不影响功能,但可以简化写法。

修正后的代码:

def mvnPath = System.getenv("MAVEN_HOME") + File.separator + "bin" + File.separator + "mvn"
def pomPath = new File("pom.xml").getAbsolutePath()
Process mavenPrimaryPackagingProcess = new ProcessBuilder(
        mvnPath, 
        "primary-package", 
        "-Pfull-release", 
        "-f", 
        pomPath
    )
    .directory(new File("."))
    .redirectOutput(ProcessBuilder.Redirect.INHERIT)
    .start()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:22:28