使用ProcessBuilder运行mvn

时间:2011-11-01 12:09:40

标签: java maven-2

我创建了一个使用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和Windows上运行linux box,那我该怎么办?

1 个答案:

答案 0 :(得分:3)

这是因为windows shell(cmd)有一个功能:它尝试将扩展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检查操作系统,并使用cmd.properties中的数据创建命令。

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