在Spring Boot项目中,properties/yml配置文件的位置在打包后会有多种情况,以下是详细的说明:
1. 默认打包结构(JAR内)
标准位置(在JAR包内):
your-app.jar
├── BOOT-INF
│ └── classes
│ ├── application.properties ← 默认主配置文件
│ ├── application.yml ← 或YAML格式
│ └── config/
│ ├── application.properties ← 配置文件目录
└── META-INF
位置 :src/main/resources/下的文件在打包后会放在JAR内部的 BOOT-INF/classes/下
2. 外部配置文件优先级(Spring Boot特性)
Spring Boot会按以下从高到低的优先级加载配置文件:
优先级顺序:
1. 命令行参数 (--spring.config.location=)
2. 当前目录下的 /config/ 子目录
3. 当前目录
4. 类路径下的 /config/ 包
5. 类路径根目录 (JAR内)
外部配置文件位置示例:
# 项目根目录结构
project/
├── your-app.jar # 打包的JAR
├── application.properties # 优先级3: 与JAR同级
├── application.yml
├── config/
│ ├── application.properties # 优先级2: config子目录
│ └── application.yml
└── logs/
3. 常见配置方式
方式1:JAR内部配置(开发/默认)
# src/main/resources/application.properties
server.port=8080
spring.application.name=myapp
方式2:外部配置文件(生产推荐)
java
# 启动时指定外部配置
java -jar your-app.jar \
--spring.config.location=file:/path/to/config/
# 或指定具体文件
java -jar your-app.jar \
--spring.config.location=file:/opt/app/application-prod.yml
方式3:多环境配置
# 1. JAR内: application.properties
spring.profiles.active=@activatedProperties@
# 2. 外部指定
java -jar app.jar --spring.profiles.active=prod
# 3. 文件命名约定
application-dev.properties # 开发环境
application-test.properties # 测试环境
application-prod.properties # 生产环境
4. 获取配置文件路径的代码示例
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
@RestController
public class ConfigController {
@Value("${spring.config.location:未指定}")
private String configLocation;
// 获取实际使用的配置文件路径
@GetMapping("/config-info")
public String getConfigInfo() {
ConfigurableEnvironment env = (ConfigurableEnvironment) environment;
// 所有属性源
StringBuilder info = new StringBuilder();
for (PropertySource<?> source : env.getPropertySources()) {
info.append("Source: ").append(source.getName()).append("\n");
}
return "当前配置位置: " + configLocation +
"\n激活的Profile: " + Arrays.toString(env.getActiveProfiles()) +
"\n属性源:\n" + info;
}
// 读取配置文件内容
public void readConfigFile() throws IOException {
// 1. 读取类路径下的文件
Resource resource = new ClassPathResource("application.properties");
if (resource.exists()) {
String content = new String(resource.getInputStream().readAllBytes());
}
// 2. 尝试读取外部文件
File externalFile = new File("application.properties");
if (externalFile.exists()) {
// 读取外部配置
}
}
}
5. 最佳实践建议
生产环境推荐:
# 目录结构
/opt/myapp/
├── bin/
│ └── app.jar # 纯净JAR,不含配置
├── config/
│ ├── application.yml # 主配置
│ └── application-prod.yml # 生产配置
├── logs/
└── start.sh # 启动脚本
# 启动脚本内容
#!/bin/bash
java -jar /opt/myapp/bin/app.jar \
--spring.config.location=file:/opt/myapp/config/ \
--spring.profiles.active=prod \
--logging.config=/opt/myapp/config/logback-spring.xml
开发配置示例(application.yml):
# src/main/resources/application.yml
spring:
config:
import: # Spring Boot 2.4+ 导入配置
- optional:file:./config/ # 外部config目录
- optional:file:./ # 外部当前目录
- optional:classpath:/ # 类路径
- optional:classpath:/config/
profiles:
active: @activatedProperties@ # Maven占位符
6. Maven/Gradle打包配置
Maven配置:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 启用属性过滤 -->
</resource>
</resources>
</build>
打包命令:
# 打包(包含资源文件)
mvn clean package
# 查看JAR内文件结构
jar tf target/your-app.jar | grep application
7. 调试技巧
# 查看JAR内配置文件
jar xf your-app.jar BOOT-INF/classes/application.properties
cat BOOT-INF/classes/application.properties
# 启动时显示配置位置
java -jar app.jar --debug
# 列出所有属性源
java -jar app.jar --spring.debug=true
总结 :生产环境推荐将配置文件放在JAR外部,便于维护和变更,通过--spring.config.location参数指定配置位置。