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

在多个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(用户目录)​ 确保路径隔离。

http://www.xdnf.cn/news/6726.html

相关文章:

  • CSS- 2.1 实战之图文混排、表格、表单、学校官网一级导航栏
  • 基于51单片机和8X8点阵屏、矩阵按键的记忆类小游戏
  • C语言文件操作
  • 第八章 模板项目生成
  • Nextjs首屏加载速度性能从80分优化到98分
  • Qt控件:交互控件
  • PT2020 20触控I2C输出IC
  • 时频分析的应用—外部信号的显影和定点清除
  • 第三部分:内容安全(第十六章:网络型攻击防范技术、第十七章:反病毒、第十八章:入侵检测/防御系统(IDS/IPS))
  • 第J1周:ResNet-50算法实战与解析
  • C语言图案代码大全:从基础到高级
  • 院校机试刷题第四天:1911反转公约数、1702十六进制不进位加法
  • PR-2021
  • ADC深入——SNR、SFDR、ENOB等概念
  • 深入浅出拆分学习,图神经网络拆分学习,混合联邦学习
  • 网络攻防模拟:城市安全 “数字预演”
  • 14 C 语言浮点类型详解:类型精度、表示形式、字面量后缀、格式化输出、容差判断、存储机制
  • AlphaEvolve:基于Gemini的算法发现与优化综合报告
  • AI在线写作平台:AnKo引领未来创作新潮流!
  • 分析主流编程语言中哪些为支持面向对象的语言
  • 什么是实景VR?实景VR应用场景
  • 如何早期识别帕金森病?
  • 《图解 TCP/IP》笔记
  • 安科瑞DJSF1352-D直流电能表:破解充电桩计量难题
  • linux安装宝塔面板到数据盘
  • python Excel操作,将一个工作表中的sheet页复制到另一个工作表中(包括单元格的内容、样式、格式等)
  • 电动汽车直流快充充电桩AEV200-DC240M4的详细介绍
  • 防篡改小工具监测被该文件
  • 【GAN网络入门系列】一,手写字MINST图片生成
  • 实战解析MCP-使用本地的Qwen-2.5模型-AI协议的未来?