即使指定了Path变量,如何解决“ CreateProcess error = 2,系统找不到指定的文件”的问题(跨平台)

时间:2019-11-05 14:10:28

标签: java groovy path

我试图从Groovy脚本中运行Maven构建。看来似乎找不到Maven。

我已经检查了path变量,它包含正确的路径。如果我专门通过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

如果我通过此命令运行其他命令,例如where可以正常工作:

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路径。

1 个答案:

答案 0 :(得分:1)

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

您可以在Windows命令解释器(cmd.exe)中键入mvn,因为它对扩展名有些聪明,所以它可以工作。但是Groovy和Java并没有做到这一点。

相反,Groovy的.execute()方法委托给Java的ProcessBuilder,在Windows上它在win32 API中调用了称为CreateProcess的本机函数。在此功能中,如果未指定扩展名,则将假定它是一个.exe文件。这就是为什么where命令(实际上是where.exe)和git(实际上是git.exe)起作用,而不是.bat和{ {1}},例如.cmd

要以与多个平台兼容的方式对其进行修复,我看到的最佳选择是检查所使用的平台并相应地更改命令。遵循以下原则:

mvn.cmd