windows平台 Runtime.getRuntime().exec() 指定路径无效的问题

近日来项目中需要用程序调用外部的脚本来执行第三方的一些功能应用。于是,第一时间想起了使用 Runtime.getRuntime().exec()  来调用脚本。在使用过程中,发现第三方的应用虽然可以通过参数传递配置文件的名字,但是却只能读和它同一目录的配置文件,不支持参数中带有路径的用法。基于这第一点,第一反应是,用exec的重构方法指定工作目录来解决,于是,写下了如下的命令

Runtime.getRuntime.exec("pshell.sh -config config.xml",null,new File("/usr/pshell/bin"));

在Linux下面运行的时候,报错,说找不到要执行的文件。可是这个文件确实是在的。好奇怪。于是查了一下资料,发现,在linxu相面,要执行的命令是必须带有路径的,于是改为

Runtime.getRuntime.exec("./pshell.sh -config config.xml",null,new File("/usr/pshell/bin"));

Linux下完美运行。

于是,想当然的将这条命令改成了下面这样,打算在windows下面运行:

Runtime.getRuntime.exec(".\\pshell.bat -config config.xml",null,new File("c:\\software\\develop\\pshell\\bin"));

结果却不能运行,同样说找不到要执行的文件。好奇怪,一开始以为是自己写错了什么,反复的查了半天,仍然没有结果。试着改动了各种写法,包括 .pshell.bat  .\\pshell.bat  pshell.bat  ./pshell.bat 都是不行。

而且如果把执行命令写成全路径,类似这样,

Runtime.getRuntime.exec("c:\\software\\develop\\pshell\\bin\\pshell.bat -config config.xml")

是可以的,说明不是文件的问题。只能是java的运行机制的问题了。

于是怀疑是JDK版本的问题。折腾了许久仍然没有解决。没办法,只好继续找资料,费了不少劲之后,突然间看到有人提到,在windows下如果要指定命令的执行路径,需要用 cmd /c  来执行,于是再次修改成这样:

Runtime.getRuntime.exec("cmd /c .\\pshell.bat -config config.xml",null,new File("c:\\software\\develop\\pshell\\bin"));

…… 居然真的可以,正常运行了。

我……  折腾了三个多小时,不过还好,总算解决了问题。看来跨平台开发的坑还真是不少呢。

你可能感兴趣的:(JAVA开发,java,windows,shell)