1. 概述

在项目开发中,使用属性文件(properties file)来存储项目配置是一种常见做法。为了便于动态调整配置,通常建议将这些配置文件放在 JAR 包外部,这样无需重新打包即可修改配置。

本文将介绍几种在 Spring Boot 应用中从 JAR 包外部加载属性文件的方式。

2. 使用默认加载路径

Spring Boot 会按照优先级顺序从以下四个位置查找外部配置文件(如 application.propertiesapplication.yml):

  1. 当前目录下的 /config 子目录
  2. 当前目录
  3. classpath 下的 /config
  4. classpath 根目录

如果当前目录的 /config 子目录下存在 application.properties,它将被加载并覆盖其他位置的同名配置项。

3. 命令行指定配置路径

如果默认路径不满足需求,可以通过命令行直接指定配置文件路径:

java -jar app.jar --spring.config.location=file:///Users/home/config/jdbc.properties

也可以指定一个目录,让 Spring Boot 自动从中查找配置文件:

java -jar app.jar --spring.config.name=application,jdbc --spring.config.location=file:///Users/home/config

另外,如果是通过 Maven 插件 启动应用,可以使用 -D 参数传递配置路径:

mvn spring-boot:run -Dspring.config.location="file:///Users/home/jdbc.properties"

⚠️ 注意:这种方式适用于本地调试或 CI/CD 场景,生产环境建议使用更稳定的配置管理方案。

4. 环境变量方式加载

如果无法修改启动命令,可以通过设置环境变量的方式指定配置文件路径:

export SPRING_CONFIG_NAME=application,jdbc
export SPRING_CONFIG_LOCATION=file:///Users/home/config
java -jar app.jar

📌 默认的 application.properties 仍然会被加载,但如果发生配置冲突,环境变量指定的配置文件具有更高优先级

5. 在 application.properties 中引入外部配置(Spring Boot 2.4+)

在 Spring Boot 2.4.0 版本之后,配置加载机制发生了变化,新增了 spring.config.import 属性,允许在 application.properties 文件中显式引入额外的配置文件:

spring.config.import=file:./additional.properties,optional:file:/Users/home/config/jdbc.properties

其中:

  • file:./additional.properties 表示从当前目录加载
  • optional: 前缀表示该文件可选,即使不存在也不会报错

⚠️ 注意:这种方式只适用于 Spring Boot 2.4 及以上版本。

6. 编程式加载配置文件

如果需要更灵活地控制配置文件加载逻辑,可以通过编程方式注册 PropertySourcesPlaceholderConfigurer Bean:

@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
    properties.setLocation(new FileSystemResource("/Users/home/conf.properties"));
    properties.setIgnoreResourceNotFound(false);
    return properties;
}

✅ 适用于需要根据运行时条件动态加载不同配置文件的场景。

7. 将配置文件排除在 Fat Jar 之外

默认情况下,Maven Spring Boot 插件会将 src/main/resources 下的所有文件打包进 JAR。如果不想将某个配置文件打入包内,可以在 pom.xml 中添加如下配置:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/conf.properties</exclude>
            </excludes>
        </resource>
    </resources>
</build>

📌 这样可以避免敏感配置被打包进 JAR,适合用于分离开发与生产环境配置。

8. 总结

Spring Boot 提供了多种灵活的外部化配置机制,开发者可以根据实际场景选择合适的加载方式:

  • ✅ 简单场景使用默认路径或命令行参数
  • ✅ 生产环境推荐使用环境变量或配置中心
  • ⚠️ 高级需求可通过编程方式控制配置加载逻辑

合理使用外部化配置,不仅提升项目灵活性,也更利于维护和部署。


原始标题:Spring Properties File Outside jar | Baeldung