Spring Boot 配置 jar 包外面的 Spring Properties 文件

一、概述

Properties 文件是我们可以用来存储项目特定信息的常用方法。理想情况下,我们应该将其保留在 jar 包之外,以便能够根据需要对配置进行更改。

在这个教程中,我们将研究在 Spring Boot 应用程序 中从 jar 外部位置加载 Properties 文件的各种方法。

二、使用默认位置

按照惯例,Spring Boot 按以下优先顺序在四个预定位置查找外部化配置文件 --- application.propertiesapplication.yml :{#crayon-5c73a186c8530009937282}

  • 当前目录的 /config 子目录
  • 当前目录
  • 一个类路径 /config
  • 类路径根

因此,application.properties 中定义并放置在当前目录的 /config 子目录中的属性将被加载。 这也会在发生冲突时覆盖其他位置的属性。

三、使用命令行

如果上述约定对我们不起作用,我们可以直接在命令行中配置位置

java -jar app.jar --spring.config.location=file:///Users/home/config/jdbc.properties

我们还可以传递应用程序搜索文件的文件夹位置:

java -jar app.jar --spring.config.name=application,jdbc --spring.config.location=file:///Users/home/config

最后,另一种方法是通过 Maven 插件 运行 Spring Boot 应用程序。

在那里,我们可以使用 -D 参数:

mvn spring-boot:run -Dspring.config.location="file:///Users/home/jdbc.properties"

四、使用环境变量

现在假设我们不能更改启动命令。

很棒的是 Spring Boot 还会读取环境变量 SPRING_CONFIG_NAMESPRING_CONFIG_LOCATION

export SPRING_CONFIG_NAME=application,jdbc
export SPRING_CONFIG_LOCATION=file:///Users/home/config
java -jar app.jar

请注意,仍将加载默认文件。但是环境特定的属性文件优先以防发生属性冲突。

  1. 使用应用程序属性

如我们所见,我们必须在应用程序启动之前定义 spring.config.namespring.config.location 属性,因此在 application.properties 文件(或 YAML 对应文件)中使用它们将没有影响。

Spring Boot 在 2.4.0 版本中修改了属性的处理方式。

与此更改一起,团队引入了一个新属性,允许直接从应用程序属性导入其他配置文件:

spring.config.import=file:./additional.properties,optional:file:/Users/home/config/jdbc.properties
  1. 以编程方式

如果我们想要编程访问,我们可以注册一个 PropertySourcesPlaceholderConfigurer bean:

public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer properties = 
      new PropertySourcesPlaceholderConfigurer();
    properties.setLocation(new FileSystemResource("/Users/home/conf.properties"));
    properties.setIgnoreResourceNotFound(false);
    return properties;
}

在这里,我们使用 PropertySourcesPlaceholderConfigurer 从自定义位置加载属性。

七、从 Fat Jar 中排除文件

Maven Boot 插件会自动将 src/main/resources 目录下的所有文件包含到 jar 包中。

如果我们不想让某个文件成为 jar 的一部分,我们可以使用一个简单的配置来排除它:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/conf.properties</exclude>
            </excludes>
        </resource>
    </resources>
</build>

在这个例子中,我们过滤掉了 conf.properties 文件,使其不包含在生成的 jar 中。

八、小结

本文展示了 Spring Boot 框架本身如何为我们处理 externalized configuration

通常,我们只需要将属性值放在正确的文件和位置。但我们也可以使用 Spring 的 Java API 进行更多控制。

与往常一样,示例的完整源代码可在 GitHub 上 获得。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-boot-maven-plugin 是一个 Maven 插件,它可以将 Spring Boot 应用程序打成可执行的 JAR 文件,同时也可以将应用程序的依赖项打成内置的 JAR 文件。这个插件还有一个很棒的功能,就是它可以将应用程序的配置文件JAR 之外,这样在应用程序升级时,可以直接替换现有的 JAR 文件而不需要担心会覆盖配置文件。 在默认的情况下,Spring Boot 将 application.properties 或者 application.yml 文件JAR 的根目录下,这种默认的方式并不是最好的,因为在应用程序升级时,配置文件会被一起打进去,这样会产生一些困扰,比如你需要手动备份这些配置文件。 为了解决这个问题,spring-boot-maven-plugin 插件提供了一个很好的解决方案,就是将配置文件JAR 之外,具体的做法是在 pom.xml 文件中添加如下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> <compress>false</compress> <shutdown>graceful</shutdown> <finalName>${project.artifactId}-${project.version}-exec</finalName> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这个配置中添加了一个 classifier 属性,它会创建一个带有 exec 后缀的 JAR ,该 JAR 除了含应用程序的类文件和依赖项,还会配置文件和其他静态资源文件。在 pom.xml 文件中加入以上配置,并在应用程序的根目录下创建一个名为 config 的目录,将配置文件放置在该目录中,然后重新编译和打应用程序,你将会得到一个新的 JAR 文件,该文件会在根目录下生成一个名为 config 的文件夹,其中含你的配置文件。这样就实现了将配置文件JAR 之外的目的。 总结一下,spring-boot-maven-plugin 插件提供了一个将应用程序的配置文件JAR 之外的方式,只需要在 pom.xml 文件配置一个 classifier 属性即可实现。这样可以避免在应用程序升级时面临配置文件被覆盖的问题,也便于组织和管理配置文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值