Java执行MVN命令报错:Cannot run program “mvn“ (in directory “C:\Users\xx“): CreateProcess error=2, 系统找不到指定的

背景:

Java 中的 Runtime 类可以执行 cmd 命令,而最近又突发奇想实现自动打 Maven 包的功能,说做会做,使用如下代码首先进行验证:

Runtime r = Runtime.getRuntime();
r.exec(”mvn -v“);

结果却报 Cannot run program "mvn" (in directory "C:\Users\xx"): CreateProcess error=2, 系统找不到指定的文件的错误。

解决过程

难道是环境变量没配置?打开cmd窗口输入相同的命令,环境变量显然是配好的。笔者又使用Runtime执行了node -v命令也是可以的,偏偏mvn -v不行,还有其他什么maven文件路径不能包含中文,空格,特殊字符等都试了全都不行,百思不得其解。

解决方式

mvn前面添加 cmd /c,如下:

Runtime r = Runtime.getRuntime();
r.exec(”cmd /c mvn -v“);

执行成功!!!,哈哈。对于为啥执行部分命令需要cmd /c前缀,部分不需要,ChatGPT是这样回答的:

在Windows系统中,执行命令时,有两种方式:一种是直接执行命令,另一种是通过命令提示符(cmd)执行命令。

对于一些简单的命令,可以直接在Java程序中执行,不需要通过命令提示符。例如,执行"dir"命令可以直接使用ProcessBuilder来执行,不需要使用"cmd"和"/c"。

但是对于一些复杂的命令,特别是需要调用其他命令或者执行一系列的命令时,需要使用命令提示符来执行。这是因为命令提示符提供了更多的功能和环境支持,可以确保命令的正确执行。

在执行mvn命令时,通常需要调用Maven的可执行文件(mvn.bat或mvn.cmd),而这些可执行文件是通过命令提示符来执行的。因此,需要使用"cmd"和"/c"来告诉Java程序使用命令提示符来执行mvn命令。

总结起来,使用"cmd"和"/c"是为了确保复杂命令的正确执行,特别是需要调用其他命令或者执行一系列的命令时。而对于简单的命令,可以直接在Java程序中执行,不需要使用"cmd"和"/c"

你可能感兴趣的:(java)