java - 即使指定了 Path 变量,如何修复 "CreateProcess error=2, The system cannot find the file specified"(跨平台)

标签 java groovy path

我正在尝试从 Groovy 脚本中运行 Maven 构建。不过似乎找不到 Maven。

我已经检查了路径变量,它包含正确的路径。如果我专门通过 C:/…/mvn.cmd 执行 mvn ,它就会起作用。

我现在使用 System.getenv() 修复了丢失的 Java_home 变量,但这对 mvn 没有帮助。奇怪的是,像 git ... 这样的命令甚至不需要指定环境就可以工作。

我也知道我可以通过打开 cmd 并在那里运行命令来解决这个问题,但我不能这样做,因为它也必须在 Mac 或 Linux 机器上运行。

File workingDir = new File(*MYWORKINGDIRECTORY*)
def mvnbuild = 'mvn package'.execute(System.getenv().collect { k, v -> "$k=$v" }, workingdir)

mvnbuild.waitForProcessOutput(System.out, System.err)

这会产生以下错误消息:

2019-11-05 13:57:12.631 ERROR *MYSCRIPT* FAILED.
Reason:
java.io.IOException: Cannot run program "mvn" (in directory "C:\Users\*MYWORKINGDIRECTORY*"): CreateProcess error=2, The system cannot find the file specified

如果我通过这个运行一些不同的命令,例如在哪里它工作得很好:

def mvnbuild = 'where mvn'.execute(System.getenv().collect { k, v -> "$k=$v" }, workingdir)

mvnbuild.waitForProcessOutput(System.out, System.err)

产生

C:\*THECORRECTMAVENPATH*\apache-maven-3.6.0\bin\mvn
C:\*THECORRECTMAVENPATH*\apache-maven-3.6.0\bin\mvn.cmd

尽管如果我尝试运行npm,它会产生与上面相同的错误

PS:我还检查了System.getenv(),它包含正确的Maven路径。

最佳答案

您在 Windows 上收到该错误的原因是您没有提供完整名称,包括扩展名。只要包含目录位于 Path 变量中,您就不必为其提供完整路径。

您可以在Windows命令解释器(cmd.exe)中输入mvn,它会起作用,因为它对扩展有点聪明。但 Groovy 和 Java 不会经历这些。

相反,Groovy 的 .execute() 方法委托(delegate)给 Java 的 ProcessBuilder,它在 Windows 上调用 win32 API 中名为 CreateProcess 的 native 函数。在此函数中,如果您不指定扩展名,它将假定它是一个 .exe 文件。这就是 where 命令(实际上是 where.exe)和 git(实际上是 git.exe)起作用的原因。 code>),但不包括其他可执行类型,例如 .bat.cmd,例如 mvn.cmd

要以与多个平台兼容的方式修复它,我看到的最佳选择是检查使用的平台并相应地更改命令。大致如下:

def mvnFileName = System.properties['os.name'].toLowerCase().contains('windows') ? 'mvn.cmd' : 'mvn'
def mvnbuild = "$mvnFileName package".execute() // ...

关于java - 即使指定了 Path 变量,如何修复 "CreateProcess error=2, The system cannot find the file specified"(跨平台),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58713148/

相关文章:

groovy - 运行Gradle测试时重复执行测试

python - Django图像字段: full or relative path?

Java找不到我的类

java - 强制 JAXB 忽略第 3 方类文件中的 getter/setter

groovy - 从Gradle中运行Groovy脚本

java - FileWriter 用 Ja​​va 写入用户桌面,而不是服务器桌面

ssis - 两个不同的任务如何在 SSIS 中转到一个任务

java - JSP Maven 项目不会在 Eclipse 中包含 src 文件夹

java - JSR 303 - javax.validation - 验证日期

grails - 为什么这种通用用法在 groovy 中不起作用?