Springboot+Maven打包时 将配置文件独立出来 并解决logback.xml不生效的情况
在 Spring Boot 项目开发中,配置的管理和加载顺序是一个非常重要的环节。不同的配置来源会在运行时影响应用的行为,当前之前有一篇介绍 springboot+mvn中根据不同环境打包不同的配置文件 ,文章主要是介绍不同的开发环境使用不同的配置文件,和这篇的内容并不冲突,这儿介绍的主要是加载顺序,了解它们的加载顺序有助于开发者根据不同的环境需求灵活调整应用配置。本文将详细介绍 Spring Boot 配置加载的优先顺序,并结合实际案例,探讨如何在打包和部署时管理这些配置文件。
Spring Boot 配置加载优先顺序
Spring Boot 会按照一定的顺序加载配置文件,不同的配置来源具有不同的优先级。以下是 Spring Boot 配置加载的优先顺序(从高到低):
命令行参数
命令行参数具有最高优先级。通过命令行传递的参数可以覆盖其他所有配置来源。
示例:java -jar app.jar --server.port=8081
在这个例子中,
server.port
的值被设置为 8081,即使其他配置文件中指定了不同的端口号,它们都会被此命令行参数覆盖。- Jar 包外部
config
目录下的配置文件
如果在 Jar 包同级目录下有/config/application.properties
或/config/application.yml
文件,Spring Boot 会优先加载这些文件。
示例路径:/config/application.yml
- Jar 包外部当前目录下的配置文件
Jar 包所在的当前目录下的配置文件./application.properties
或./application.yml
,优先级略低于config
目录下的文件。
示例路径:./application.properties
- Jar 包内部
config
目录下的配置文件
当外部没有提供配置文件时,Spring Boot 会加载 Jar 包内部config
目录中的配置文件,路径为classpath:/config/application.properties
或classpath:/config/application.yml
。 - Jar 包内部根目录下的配置文件
如果config
目录中没有相关配置,Spring Boot 会尝试加载 Jar 包根目录下的配置文件,即classpath:/application.properties
或classpath:/application.yml
。 特定的
@PropertySource
注解的配置文件
如果代码中使用了@PropertySource
注解指定额外的配置文件,那么这些文件的优先级略低于上述默认的配置文件。
示例:@Configuration @PropertySource("classpath:custom.properties") public class CustomConfig { // 配置内容 }
- Spring Boot 默认配置
当所有其他配置文件都没有设置特定的值时,Spring Boot 会加载默认配置。例如,默认的server.port
为 8080。
示例:配置文件的打包与加载
在生产环境中,我们经常需要将配置文件与 Jar 包分离。Spring Boot 提供了灵活的机制,允许将配置文件放置在 Jar 包的外部,以便于在不同环境中动态加载配置。以下是一个典型的配置打包示例:
1. 打包时将配置文件放置在 Jar 包外的 config
目录中
在实际部署时,通常将配置文件放在与 Jar 包同级的 config
目录下。这样可以避免每次修改配置都需要重新打包。
步骤:
- 将 Spring Boot 项目中的
src/main/resources
目录下的application.yml
或application.properties
文件复制到 Jar 包同级的config
目录。 - 修改构建脚本(如 Maven 或 Gradle),排除资源目录下的默认配置文件。
Maven 打包示例:
在 pom.xml
文件中使用 <resources>
标签来排除默认的配置文件:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application.yml</exclude>
<exclude>application.properties</exclude>
</excludes>
</resource>
</resources>
</build>
通过这种方式,打包后的 jar
文件中将不包含 application.yml
或 application.properties
,这样 Spring Boot 就会优先加载外部 config
目录中的配置文件。
2. 处理 logback.xml 文件的问题
在实际项目中,日志配置文件 logback.xml
通常放置在 src/main/resources
目录下。如果我们希望将它与其他配置文件一样放到 config
目录中,默认情况下 Spring Boot 不会自动加载 config/logback.xml
文件。要解决这一问题,可以使用以下方法:
方法一:更改文件名
将 logback.xml
文件重命名为 logback-spring.xml
,Spring Boot 会自动加载这个文件,即使它放在 config
目录下。
路径:config/logback-spring.xml
方法二:在 application.yml
中指定日志配置文件路径
另一种解决方案是在 application.yml
中显式指定 logback.xml
文件的路径:
logging:
config: ./config/logback.xml
通过这种方式,可以灵活管理日志配置,并且不需要修改文件名。
3. 部署示例
假设你的项目结构如下:
/app/
├── app.jar
├── config/
│ ├── application.yml
│ └── logback.xml
在此结构下,Spring Boot 会自动加载 config/application.yml
和 config/logback.xml
。配置文件的修改不会影响到 app.jar
文件的重新打包。
总结
Spring Boot 的配置加载遵循一套严格的优先顺序,允许开发者根据环境需求进行灵活配置。命令行参数优先级最高,而默认配置优先级最低。将配置文件放置在 Jar 包外部 config
目录中是常见的实践,特别适合生产环境的部署需求。
此外,logback.xml
文件不会被默认加载到 config
目录中,可以通过重命名文件或在 application.yml
中配置路径来解决。
最后,通过打包时排除默认的配置文件,并将其放置在 Jar 包同级的 config
目录中,可以让应用在不同环境下方便管理和加载不同的配置文件,提升应用的可维护性和灵活性。
版权声明:本文为原创文章,版权归 全栈开发技术博客 所有。
本文链接:https://www.lvtao.net/dev/springboot-maven-config-application-logback.html
转载时须注明出处及本声明