在多个SpringBoot程序中./相对路径下隐患、文件覆盖问题
概述
两个 Spring Boot 应用生成的配置文件被覆盖,是因为 相对路径的解析依赖于当前工作目录(Working Directory),而你可能在运行应用时未正确设置各自的工作目录。以下是具体原因和解决方案:
原因分析
-
相对路径的陷阱
你使用的路径是./test.json
,其中./
表示 当前工作目录(即启动 Java 进程时所在的目录)。如果两个应用启动时的工作目录相同(例如都在 IDE 的默认目录下运行),它们会指向同一个文件路径,导致互相覆盖。 -
盘符(C盘、E盘)的误解
虽然两个应用代码分布在 C 盘和 E 盘的代码目录中,但 启动应用时的工作目录可能与代码所在目录无关。例如:- 如果你在 IDE 中运行应用,工作目录可能被统一设置为 IDE 的默认目录(如
$PROJECT_DIR
)。 - 如果你通过命令行运行,工作目录取决于执行命令时所在的路径。
- 如果你在 IDE 中运行应用,工作目录可能被统一设置为 IDE 的默认目录(如
验证问题
在代码中添加以下调试语句,打印文件的绝对路径:
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):
- 打开
Run/Debug Configurations
。 - 在
Working Directory
中为每个应用设置不同的工作目录。
- 打开
总结
根本问题在于 相对路径的解析依赖于当前工作目录,而两个应用运行时的工作目录被误设为同一位置。通过使用绝对路径、类路径资源或动态生成唯一路径,可以彻底避免文件覆盖问题。建议优先采用 方案 2(类路径资源) 或 方案 3(用户目录) 确保路径隔离。