【沉浸式解决问题】System.getProperty(“user.dir“)获取不到项目根目录

目录

一、问题描述

在微服务项目中使用System.getProperty("user.dir")获取不到父工程项目根目录,获取到的是当前子模块目录


二、场景还原

1. 测试类

java 复制代码
package com.example.demo311;

import org.junit.jupiter.api.Test;


public class Temp2 {
    @Test
    void test1() {
        System.out.println(System.getProperty("user.dir"));
    }
}

2. 目录结构

3. 运行结果


三、原因分析

System.getProperty("user.dir")实际上返回的是Java虚拟机(JVM)启动时的工作目录,而不是代码所在的目录。

换成同样路径下的main方法测试:

java 复制代码
package com.example.demo311;

public class Temp {
    public static void main(String[] args) {
        System.out.println(System.getProperty("user.dir"));
    }
}

就得到了想要的结果

猜测是junit启动时修改了JVM的路径参数


四、解决方案

如果不是在@Test中运行,那是没问题的,但如果你想我一样,使用System.getProperty("user.dir")的方法需要传入不同的参数多次使用,同时又不是业务代码,只能在测试类里运行,那可以通过以下两种方式:

1. 使用相对路径

如果你知道项目结构,可以通过相对路径来定位根目录。

java 复制代码
File rootDir = new File(System.getProperty("user.dir")).getParentFile();
System.out.println(rootDir.getAbsolutePath());

2. 使用资源路径

如果项目中有一个固定的资源文件,可以通过类加载器来获取项目的根目录。

java 复制代码
URL resource = Temp2.class.getResource(Temp2.class.getSimpleName() + ".class");
if (resource != null) {
    String path = resource.getPath();
    File rootDir = new File(path).getParentFile().getParentFile().getParentFile();
    System.out.println(rootDir.getAbsolutePath());
}

喜欢的点个关注吧><!祝你永无bug!

txt 复制代码
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            佛祖保佑       永无BUG
*/
相关推荐
float_六七19 小时前
IntelliJ IDEA双击Ctrl的妙用
java·ide·intellij-idea
能摆一天是一天20 小时前
JAVA stream().flatMap()
java·windows
颜如玉21 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂1 天前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年1 天前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
gb42152871 天前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草1 天前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6921 天前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea1 天前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha1 天前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统