【沉浸式解决问题】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
*/
相关推荐
hqxstudying2 小时前
Java异常处理
java·开发语言·安全·异常
我命由我123455 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康7 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
YuTaoShao9 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw10 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨10 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂40410 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空11 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_43766431411 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿00111 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式