我创建了一个类,该类使用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)具有一个功能:它尝试向exe您正在运行的命令行添加扩展名,’bat’,’cmd’。找到第一个匹配项(即文件系统中确实存在的文件)后,它将运行它。
exe
如果是Maven,您将拥有mvn无法在Windows和Windows批处理文件’.bat’上执行的Unix Shell脚本。命令提示符将“ .bat”添加到您在命令提示符中键入的“ mvn”,看到该文件存在并运行它。
mvn
当您从Java运行进程时,您没有外壳程序,因此没有人做此工作。我建议您检查操作系统并按操作系统保留命令。如果要清除解决方案,请创建资源文件cmd.properties:
mvn.windows = mvn.bat mvn.unix = mvn
现在使用系统属性检查OS,os.name并使用中的数据创建命令cmd.properties。
os.name
cmd.properties
另一种解决方案是cmd /c在Windows 上运行命令,在UNIX上运行’/ bin / sh -c’,但这并不能简化任何事情,因此我避免这样做。
cmd /c