Springboot+Maven打包时 将配置文件独立出来 并解决logback.xml不生效的情况

在 Spring Boot 项目开发中,配置的管理和加载顺序是一个非常重要的环节。不同的配置来源会在运行时影响应用的行为,当前之前有一篇介绍 springboot+mvn中根据不同环境打包不同的配置文件 ,文章主要是介绍不同的开发环境使用不同的配置文件,和这篇的内容并不冲突,这儿介绍的主要是加载顺序,了解它们的加载顺序有助于开发者根据不同的环境需求灵活调整应用配置。本文将详细介绍 Spring Boot 配置加载的优先顺序,并结合实际案例,探讨如何在打包和部署时管理这些配置文件。

Spring Boot 配置加载优先顺序

Spring Boot 会按照一定的顺序加载配置文件,不同的配置来源具有不同的优先级。以下是 Spring Boot 配置加载的优先顺序(从高到低):

  1. 命令行参数
    命令行参数具有最高优先级。通过命令行传递的参数可以覆盖其他所有配置来源。
    示例:

    java -jar app.jar --server.port=8081

    在这个例子中,server.port 的值被设置为 8081,即使其他配置文件中指定了不同的端口号,它们都会被此命令行参数覆盖。

  2. Jar 包外部 config 目录下的配置文件
    如果在 Jar 包同级目录下有 /config/application.properties/config/application.yml 文件,Spring Boot 会优先加载这些文件。
    示例路径:/config/application.yml
  3. Jar 包外部当前目录下的配置文件
    Jar 包所在的当前目录下的配置文件 ./application.properties./application.yml,优先级略低于 config 目录下的文件。
    示例路径:./application.properties
  4. Jar 包内部 config 目录下的配置文件
    当外部没有提供配置文件时,Spring Boot 会加载 Jar 包内部 config 目录中的配置文件,路径为 classpath:/config/application.propertiesclasspath:/config/application.yml
  5. Jar 包内部根目录下的配置文件
    如果 config 目录中没有相关配置,Spring Boot 会尝试加载 Jar 包根目录下的配置文件,即 classpath:/application.propertiesclasspath:/application.yml
  6. 特定的 @PropertySource 注解的配置文件
    如果代码中使用了 @PropertySource 注解指定额外的配置文件,那么这些文件的优先级略低于上述默认的配置文件。
    示例:

    @Configuration
    @PropertySource("classpath:custom.properties")
    public class CustomConfig {
        // 配置内容
    }
  7. Spring Boot 默认配置
    当所有其他配置文件都没有设置特定的值时,Spring Boot 会加载默认配置。例如,默认的 server.port 为 8080。

示例:配置文件的打包与加载

在生产环境中,我们经常需要将配置文件与 Jar 包分离。Spring Boot 提供了灵活的机制,允许将配置文件放置在 Jar 包的外部,以便于在不同环境中动态加载配置。以下是一个典型的配置打包示例:

1. 打包时将配置文件放置在 Jar 包外的 config 目录中

在实际部署时,通常将配置文件放在与 Jar 包同级的 config 目录下。这样可以避免每次修改配置都需要重新打包。

步骤:

  • 将 Spring Boot 项目中的 src/main/resources 目录下的 application.ymlapplication.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.ymlapplication.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.ymlconfig/logback.xml。配置文件的修改不会影响到 app.jar 文件的重新打包。

总结

Spring Boot 的配置加载遵循一套严格的优先顺序,允许开发者根据环境需求进行灵活配置。命令行参数优先级最高,而默认配置优先级最低。将配置文件放置在 Jar 包外部 config 目录中是常见的实践,特别适合生产环境的部署需求。

此外,logback.xml 文件不会被默认加载到 config 目录中,可以通过重命名文件或在 application.yml 中配置路径来解决。

最后,通过打包时排除默认的配置文件,并将其放置在 Jar 包同级的 config 目录中,可以让应用在不同环境下方便管理和加载不同的配置文件,提升应用的可维护性和灵活性。

标签: Java

相关文章

Java中线程池遇到父子任务示例及避坑

在Java中使用线程池可以有效地管理和调度线程,提高系统的并发处理能力。然而,当涉及到父子任务时,可能会遇到一些常见的Bug,特别是在子线程中查询数据并行处理时。本文将通过示例代码展示这些常见问...

java中异步任务的实现详解

在Java中实现异步任务是一种提高应用程序性能和响应性的常用技术。异步编程允许某些任务在等待其他任务完成时继续执行,从而避免了阻塞。本文将介绍几种在Java中实现异步任务的方法,并讨论它们的解决...

解密 ClassFinal 加密的 Java Jar包

ClassFinal 是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。要点...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件