背景:
有项目A,放置在E:/ 根目录下,有项目B,放置在E:/bp/ 目录下。
项目A负责项目B的重启,通过cmd命令以及bat脚本。
java里面,运行系统命令的代码:
String commands= "";
Process pro = Runtime.getRuntime().exec(commands);
exec方法源码:
public Process exec(String command) throws IOException {
return exec(command, null, null);
}
可以看到,他后面还有两个参数,默认都为null。关于这两个参数,可以在同一个class文件里头找到对应的说明:
@param envp array of strings, each element of which
has environment variable settings in the format
<i>name</i>=<i>value</i>, or
<tt>null</tt> if the subprocess should inherit
the environment of the current process.
@param dir the working directory of the subprocess, or
<tt>null</tt> if the subprocess should inherit
the working directory of the current process.
大致就是,envp是子线程应该继承的一些变量配置,为空时默认以当前线程为主。
而dir,是目录。为空时默认继承当前的线程目录。大概就是,如果你要在A.jar里执行 java -jar E:/bp/B.jar 命令,如果没有设置dir,那么B.jar在启动后,将默认以E:/ 目录为主,这时候,你在B.jar获取的路径,如:
getPath(),
getAbsolutePath(),
getCanonicalPath()
都会取到E:/ 根目录,而不是E:/bp/
所以,如果有需要,需要特别指明,如下:
String commands= "";
File file = new File("E:/bp/");
Process pro = Runtime.getRuntime().exec(commands, null, file);