1. 概述
在项目开发中,使用属性文件(properties file)来存储项目配置是一种常见做法。为了便于动态调整配置,通常建议将这些配置文件放在 JAR 包外部,这样无需重新打包即可修改配置。
本文将介绍几种在 Spring Boot 应用中从 JAR 包外部加载属性文件的方式。
2. 使用默认加载路径
Spring Boot 会按照优先级顺序从以下四个位置查找外部配置文件(如 application.properties
或 application.yml
):
- 当前目录下的
/config
子目录 - 当前目录
- classpath 下的
/config
包 - 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 提供了多种灵活的外部化配置机制,开发者可以根据实际场景选择合适的加载方式:
- ✅ 简单场景使用默认路径或命令行参数
- ✅ 生产环境推荐使用环境变量或配置中心
- ⚠️ 高级需求可通过编程方式控制配置加载逻辑
合理使用外部化配置,不仅提升项目灵活性,也更利于维护和部署。