JVM启动目录与项目根路径的常见误区
(user.dir)将JVM启动之际那种当下的工作目录给返回出来, 并非项目源码或者构建根目录可靠的方案应当是基于、jar的位置或者明显一点的 -Dapp.home参数。(user.dir)所返回的, 乃是JVM启动之际的当下工作目录, 并非项目源码的根目录, 也不是pom.xml或者build.所处的位置, 这一点务必要首先明晰。它有可能指向IDE的根、终端启动路径, 甚至是容器的/, 与“项目根路径”常常并不一致。为什么 user.dir 不能直接当“项目根路径”用常见误判场景真正可靠的替代方案从 或 jar 位置反推为了能够得到“项目构建产物的逻辑根”, 那就应当以运行时资源能够被定位的那个锚点作为依据。常见的做法是:示例获取 jar 所在目录URL location MyClass.class.getProtectionDomain().getCodeSource().getLocation(); String jarDir new File(location.toURI()).getParentFile().getAbsolutePath();如果非要用 user.dir至少加一层校验仅仅是在你的部署流程对启动路径有着严格的约束情况之下, 比如说所有的脚本都要执行cd $( $0)/.. java ...这样的操作, 这个时候才去考虑使用user.dir, 并且一定要去验证关键文件是不是存在:不要去假定, user.dir必然是“正确的”, 它仅仅是操作系统那个层面的cwd, JVM并不在意你心里所认为的“项目根”究竟是哪一个。真正的项目根路径不存在通用的定义, 它依赖于你如何去定义“项目”, 是源码的结构, 还是构建产物的结构, 亦或是部署包的结构? 选择哪一种方式, 这要看你的实际用途。是加载配置, 还是写日志, 或是读取模板文件? 不同的场景下应该使用的锚点是全然不同的。