当前位置: 首页 > news >正文

在多个SpringBoot程序中./相对路径下隐患、文件覆盖问题

概述

两个 Spring Boot 应用生成的配置文件被覆盖,是因为 ​相对路径的解析依赖于当前工作目录(Working Directory)​,而你可能在运行应用时未正确设置各自的工作目录。以下是具体原因和解决方案:


原因分析

  1. 相对路径的陷阱
    你使用的路径是 ./test.json,其中 ./ 表示 ​当前工作目录​(即启动 Java 进程时所在的目录)。如果两个应用启动时的工作目录相同(例如都在 IDE 的默认目录下运行),它们会指向同一个文件路径,导致互相覆盖。

  2. 盘符(C盘、E盘)的误解
    虽然两个应用代码分布在 C 盘和 E 盘的代码目录中,但 ​启动应用时的工作目录可能与代码所在目录无关。例如:

    • 如果你在 IDE 中运行应用,工作目录可能被统一设置为 IDE 的默认目录(如 $PROJECT_DIR)。
    • 如果你通过命令行运行,工作目录取决于执行命令时所在的路径。

验证问题

在代码中添加以下调试语句,打印文件的绝对路径:

String absolutePath = new File(TEST_FILE_PATH).getAbsolutePath();
System.out.println("配置文件绝对路径: " + absolutePath);

运行两个应用时,观察输出路径是否如你预期分布在 C 盘和 E 盘。


解决方案

方案 1:使用绝对路径

直接配置绝对路径,确保路径唯一性:

// 示例:Windows 系统
APP1_CONFIG_FILE_PATH = "E:/myapp1/APP1.json";  // 应用1
APP2_CONFIG_FILE_PATH = "C:/myapp2/APP2.json";  // 应用2
方案 2:基于项目目录的路径

将配置文件放在项目目录内(如 src/main/resources),通过类路径访问:

// 示例:将文件生成到用户目录下的应用专属目录
String userHome = System.getProperty("user.home");
APP1_CONFIG_FILE_PATH = userHome + "/app1/test.json";  // 应用1
APP2_CONFIG_FILE_PATH = userHome + "/app2/test.json";  // 应用2
方案 3:动态生成唯一路径

使用用户目录或临时目录,避免路径冲突:

// 示例:将文件生成到用户目录下的应用专属目录
String userHome = System.getProperty("user.home");
APP1_CONFIG_FILE_PATH = userHome + "/app1/test_service.json";  // 应用1
APP2_CONFIG_FILE_PATH = userHome + "/app2/test_service.json";  // 应用2
方案 4:明确设置工作目录

在启动应用时,通过命令行或 IDE 指定工作目录:

  • 命令行启动

# 启动应用1(工作目录设为 C:/app1)
cd C:/app1 && java -jar app1.jar# 启动应用2(工作目录设为 E:/app2)
cd E:/app2 && java -jar app2.jar
  • IDE 配置​(如 IntelliJ IDEA):

    1. 打开 Run/Debug Configurations
    2. 在 Working Directory 中为每个应用设置不同的工作目录。

总结

根本问题在于 ​相对路径的解析依赖于当前工作目录,而两个应用运行时的工作目录被误设为同一位置。通过使用绝对路径、类路径资源或动态生成唯一路径,可以彻底避免文件覆盖问题。建议优先采用 ​方案 2(类路径资源)​ 或 ​方案 3(用户目录)​ 确保路径隔离。

相关文章:

  • 【C/C++】C++中引用类型私有成员的设计与应用
  • Git - 2( 12000 字详解 )
  • 【leetcode】144. 二叉树的前序遍历
  • SpringBoot--Bean管理详解
  • 双轨雷达波测流系统:开启水文监测新时代
  • math toolkit for real-time development读书笔记一-三角函数快速计算(1)
  • 频域中的反射-信号完整性分析
  • 如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
  • 【踩坑】修复Cloudflare的Origin Rules端口重定向不生效
  • 【C#】 lock 关键字
  • RabbitMQ 扇形交换器工作原理详解
  • Ubuntu24.04 安装 5080显卡驱动以及cuda
  • python Excel操作,将一个工作表中的sheet页复制到另一个工作表中(包括单元格的内容、样式、格式等)
  • 进阶-数据结构部分:1、数据结构入门
  • SOLIDWORKS Simulation接触定义精讲(一)
  • 【Linux】Linux安装并配置MongoDB
  • Manim教程:第12章 函数,函数图像和文字的渲染
  • React组件(一):生命周期
  • 用Python绘制梦幻星空
  • 软件架构风格系列(3):管道 - 过滤器架构
  • 有关“普泽会”,俄官方表示:有可能
  • 哪条线路客流最大?哪个站点早高峰人最多?上海地铁一季度客流报告出炉
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药
  • 梅花奖在上海|话剧《主角》:艺术与人生的交错
  • 银行积分大幅贬值遭质疑,涉及工行、中行、农行等
  • 马上评|文玩字画竞拍轻松赚差价?严防这类新型传销