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

相关文章

如何使用Go编写跨平台组件并让Java或PHP调用

在现代软件开发中,跨语言调用是一个常见的需求。假设我们有一个用Go语言编写的组件,我们希望Java或PHP能够直接调用这个组件中对外提供的方法。为了实现这一目标,我们可以使用以下几种方法:1. ...

linux下或macOS中配置maven及加速

下载 Maven 压缩包:访问 Maven 官方下载页面,下载你需要的版本。解压压缩包:将下载的压缩包解压到你选择的目录,例如 /opt/maven:sudo mkdir -p /opt/mav...

javax.validation中数据验证的注解使用与示例

javax.validation 是 Java 提供的一个用于数据验证的库,其中定义了多种用于约束和验证数据的注解。下面对常用的验证注解类进行详细介绍,并提供对应的使用示例,每个注解都配有中文注...

编译最新的kkFileView并使用docker打包

kkFileView 是一个开源的文件预览服务,支持多种文件格式的在线预览。本文将详细介绍如何编译 kkFileView 的最新版本,并将其打包成 Docker 镜像。1. 环境准备在开始之前,...

Spring Boot 内置的常用工具类整理

Spring Boot 在核心库中提供了一系列常用的工具类,涵盖了断言、对象处理、集合操作、文件与资源处理、IO 流、反射和 AOP。这些工具类帮助开发者提高代码的简洁性和可维护性。本文将对这些...

JAVA+VUE的多国语言跨境电商外贸商城源码

多语言跨境电商外贸商城TikTok内嵌商城,商家入驻、一键铺货、一键提货 全开源完美运营海外版抖音TikTok商城系统源码,TikToK内嵌商城,跨境商城系统源码接在tiktok里面的商城。ti...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件