使用ProcessBuilder运行mvn

我创建了一个使用ProcessBuilder创建流程然后启动流程的类

ProcessBuilder pb = new ProcessBuilder("mvn","exec:java","-Dexec.mainClass="+"FunnyClass"); 

现在当我在linux机器上运行这个类时,它运行正常,但在Windows上它给我错误,说明找不到’mvn’之类的东西,我需要改为

 ProcessBuilder pb = new ProcessBuilder ("mvn.bat","exec:java","-Dexec.mainClass="+"FunnyClass"); 

但是,如果我在命令提示符“mvn exec:java -Dexec.mainClass = FunnyClass”上运行命令,它运行正常。 那么为什么我需要在processbuilder中提供mvn.bat。

有什么解决方案吗?

我的java应用程序将在windows和linux机器上运行,那么我该怎么办?

发生这种情况是因为windows shell(cmd)有一个function:它尝试将扩展exe ,’bat’,’cmd’添加到正在运行的命令行。 一旦找到第一个匹配(即文件系统中确实存在的文件),它就会运行它。

在maven的情况下,你有unix shell脚本mvn ,无法在Windows和Windows批处理文件’.bat’上执行。 命令提示符将’.bat’添加到您在命令提示符下键入的’mvn’,看到该文件存在并运行它。

当你从java运行进程时你没有shell,所以没有人做这个工作。 我建议您检查操作系统并按操作系统保持命令。 如果要清除解决方案,请创建资源文件cmd.properties:

 mvn.windows = mvn.bat mvn.unix = mvn 

现在使用系统属性os.name和create命令检查OS,使用cmd.properties数据。

替代解决方案是在Windows上使用cmd /c运行命令,在unix上使用’/ bin / sh -c’运行命令,但它不会简化任何操作,所以我会避免这种情况。