最近阅读了一些tomcat源码,看到tomcat在读取jar包外配置文件,是将“user.dir”的路径作为home path文件即
通过System.getProperty("user.dir")找到相关配置。然后自己做了一些尝试,发现在eclipse执行的时候,
这个user.dir指向工程目录下,貌似是想要的结果,但是继续试验发现,当用于一个windows services
来启动这个jar包的时候,发现没有按照预期的方式将日志写在jar包同目录下打印出来,
十分困惑,后来进一步查看tomcat相关源码,注意到在commons-daemon(c++)源码中,启动jar包前,使用了SetCurrentDirectoryW(SO_STARTPATH)设定了当前exe所在的路径为当前的工作目录,这就是问题点,
设定以后jar包内获取的"user.dir",就为当前的exe所在路径(jar包和exe放在同一个路径下)。
查阅了一些关于"user.dir"的资料,有如下等解释:
1. "user.dir":User's current working directory (官方) 其实不太好理解
2. 就是运行dos命令的那个目录:
例如:
C:\Documents and Settings\user>java xxx
就是指的C:\Documents and Settings\user这个目录
(在哪里java <yourClass> 哪里就是你的working directory.)
3. 用户当前程序运行的路径(用户当前工作目录)
这个有点豁然开朗的感觉,想想看,执行service的时候,其实已经有了当前的运行程序的路径,而不是exe具体执行的路径
进过测试打印是这个路径: C:\Windows
所以需要通过SetCurrentDirectory重新设定一下。