关于java运行Runtime.getRuntime().exec,启动jar包后,路径出错的问题

背景:

有项目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);
发布了40 篇原创文章 · 获赞 26 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/guowujun321/article/details/101123847