我正在尝试从 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/