【沉浸式解决问题】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
*/
相关推荐
霸道流氓气质19 分钟前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3761 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02141 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
步行cgn2 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ2 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog2 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老3 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang3 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库
鱼宵4 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21
学长毕设4 小时前
基于SpringBoot的餐厅管理系统-附源码
java·spring boot·后端