JAVA系统属性usr.dir到底代表什么?

316 阅读2分钟

Trying to understand on what "user.dir" property actually means?

我们大致分两种情况来讨论:

  1. 通过非shell进程,比如go程序(假设当前这个进程的工作目录是/usr/go/),手动执行系统调用启动 jvm 对应的二进制启动程序。

    1. 一般是可以指定启动时程序对应进程的 工作目录,这时,usr.dir = 指定的工作目录
    2. 如果不指定,这时,usr.dir = /usr/go 当前这个程序对应进程的 工作目录
  2. 通过shell进程启动java程序时,比如java -jar xxx

    usr.dir = 当前shell程序的工作目录,也就是你通过cd命令进入的目录。

    举例
    cd /usr/test1
    java -jar xxxx.jar 
    结果:usr.dir = "/usr/test1"
    
    cd /usr/test2
    java -jar xxxx.jar 
    结果:usr.dir = "/usr/test2"
    

结论:

usr.dir代表的是当前运行的jvm进程的工作目录,注意看,是进程的工作目录。

而进程的工作目录并不是java独有的概念,是操作系统层面的,每个进程都会有一个自己的工作目录。

原理:除了0号进程,所有进程都是由某一个父进程启动的,且会继承一部分父进程的信息,其中就包括了 工作目录 这一进程属性。

顺便提一嘴,这里涉及到spring的一个配置 spring.location,其默认说会寻找 file:./ 目录下的配置文件,如 application-{profile}.yaml等,有很多文章对这个目录具体在哪,说的模棱两可,没有讲清楚原理,容易造成误导,其实这个目录指的就是 Java进程的工作目录,而不一定是你jar包所在的目录,之所以大部分情况它在你jar包所在的目录,只是因为你启动jar包时,往往是做了如下操作:

cd xxx/java程序所在目录
## 此时当前shell进程的工作目录已经被切换了
java -jar ./xxx.jar
## 启动了java进程,java进程会继承shell进程的工作目录
## usr.dir = /xxx/java程序所在目录
## 此时file:./ 就等于 /xxx/java程序所在目录