我创建了一个使用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,那我该怎么办?
答案 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'运行命令,但它不会简化任何操作,所以我会避免这种情况。