Spring Boot 应用的配置加载遵循一套精密的优先级规则体系。理解这套机制是灵活指定配置文件的前提。当执行 java -jar 启动应用时,配置加载顺序如下:
-- 或 -D 传递的参数会覆盖其他配置源关键细节:
--spring.config.location实际上会重置默认的配置搜索路径,而--spring.config.additional-location则是在默认路径基础上追加新的搜索位置。
这是最直接的指定方式,适用于需要完全控制配置文件位置的场景。实际使用时需要注意路径格式:
bash复制# 类路径资源(打包在jar内的配置)
java -jar app.jar --spring.config.location=classpath:/config/override.yml
# 文件系统路径(推荐使用file:前缀明确协议)
java -jar app.jar --spring.config.location=file:/etc/app/config/prod.yml
# 相对路径(基于工作目录)
java -jar app.jar --spring.config.location=file:./external-config/
路径处理要点:
file:C:\\path\\to\\config.yml/结尾,文件则直接指定全名当需要保持配置文件在标准位置但改变文件名时使用。典型场景:
bash复制# 加载名为custom.yml的配置文件
java -jar app.jar --spring.config.name=custom
实现原理:
.properties > .yml > .yaml实战技巧:结合目录定位使用效果更佳,如
--spring.config.location=file:./conf/ --spring.config.name=app-config
这是生产环境推荐的配置方式,兼具灵活性和规范性:
bash复制java -jar app.jar \
--spring.config.location=file:/deploy/config/ \
--spring.config.name=application,override
这种组合会:
与--参数等效但语法不同的另一种方式:
bash复制java -Dspring.config.location=file:/opt/config/ \
-Dspring.config.name=cluster \
-jar app.jar
两种写法的本质区别:
--参数:Spring Boot专属,通过ApplicationArguments接口获取-D参数:JVM系统属性,通过System.getProperties()获取重要差异:
-D参数必须放在-jar之前,这是Java命令的语法要求
最常用的多环境配置方案,遵循约定优于配置原则:
bash复制# 激活local profile
java -Dspring.profiles.active=local,debug -jar app.jar
对应的配置文件命名要求:
复杂系统常见的配置策略:
bash复制java -jar app.jar \
--spring.config.location=\
classpath:/default.yml,\
file:/etc/app/db-config.yml,\
file:/etc/app/redis-config.yml
最佳实践:
敏感信息处理:
bash复制chmod 400 /etc/app/secure-config.yml
目录权限控制:
bash复制mkdir -p /etc/app/config
chown app:app /etc/app/config
chmod 750 /etc/app/config
Docker环境下的配置注入方式:
dockerfile复制FROM openjdk:17-jdk
COPY target/app.jar /app/
ENTRYPOINT ["java", "-jar", "/app/app.jar", \
"--spring.config.location=file:/config/"]
运行时挂载配置:
bash复制docker run -v /host/config/:/config/ app-image
查看最终生效配置:
bash复制java -jar app.jar --debug
在日志中搜索"Config resource locations"和"Loaded properties"
配置覆盖检查:
bash复制java -jar app.jar --spring.config.location=file:/tmp/test.yml \
| grep -A5 "Property source"
检查参数位置是否正确
bash复制# 错误示例(-D参数在-jar后)
java -jar app.jar -Dspring.profiles.active=dev
# 正确写法
java -Dspring.profiles.active=dev -jar app.jar
验证文件可读性
bash复制sudo -u app-user cat /path/to/config.yml
检查文件格式(特别是YAML缩进)
当多个配置源存在冲突时,记住这个优先级口诀:
"命令行 > 特定profile > 默认profile > 系统属性 > 环境变量"
典型冲突案例:
@ConfigurationProperties懒加载yaml复制spring:
cloud:
refresh:
enabled: false
使用spring.config.activate.*实现条件配置:
yaml复制# application-k8s.yml
spring:
config:
activate:
on-cloud-platform: kubernetes
profiles: k8s
激活方式:
bash复制java -jar app.jar --spring.profiles.active=k8s
集成Jasypt实现配置加密:
添加依赖:
xml复制<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
加密配置示例:
yaml复制db:
password: ENC(密文)
启动时提供密钥:
bash复制java -jar app.jar --jasypt.encryptor.password=密钥
结合Spring Cloud Config实现动态刷新:
添加注解:
java复制@RefreshScope
@RestController
public class MyController {
@Value("${custom.property}")
private String value;
}
触发刷新:
bash复制curl -X POST http://localhost:8080/actuator/refresh
版本控制:
环境隔离:
bash复制# 开发环境
java -jar app.jar --spring.profiles.active=dev
# 预发环境
java -jar app.jar --spring.profiles.active=staging
# 生产环境(从固定目录加载)
java -jar app.jar --spring.config.location=file:/etc/app/prod/
暴露配置端点:
yaml复制management:
endpoints:
web:
exposure:
include: env,configprops
定期检查配置一致性:
bash复制diff <(curl -s http://host1:8080/actuator/env) \
<(curl -s http://host2:8080/actuator/env)
java复制@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {
@NotNull private String version;
@Min(1024) private int port;
}
在实际企业级应用中,我们通常会结合配置中心(如Nacos、Consul)实现更复杂的配置管理。但掌握这些基础命令行配置技巧,仍然是每个Java开发者必备的核心能力。