我试图从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路径。
答案 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