【沉浸式解决问题】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
*/
相关推荐
vibag23 分钟前
第十六届蓝桥杯复盘
java·算法·蓝桥杯·竞赛
珹洺36 分钟前
计算机操作系统(十一)调度器/调度程序,闲逛调度与调度算法的评价指标
android·java·算法
墨着染霜华40 分钟前
JAVA8怎么使用9的List.of
java·list
编程、小哥哥1 小时前
Java求职面经分享:Spring Boot到微服务,从理论到实践
java·hadoop·spring boot·微服务·kafka
有梦想的攻城狮2 小时前
spring中的BeanFactoryAware接口详解
java·后端·spring·beanfactory
若汝棋茗2 小时前
C#在 .NET 9.0 中启用二进制序列化:配置、风险与替代方案
java·c#·.net·序列化
通达的K2 小时前
Java的常见算法和Lambda表达式
java·数据结构·算法
liubo666_2 小时前
JVM梳理(逻辑清晰)
java·jvm·后端
一刀到底2112 小时前
java 在用redis 的时候,如何合理的处理分页问题? redis应当如何存储性能最佳
java·开发语言·redis
软考真题app2 小时前
软件设计师考试三大核心算法考点深度解析(红黑树 / 拓扑排序 / KMP 算法)真题考点分析——求三连
java·开发语言·算法·软考·软件设计师