当前位置:首页 >知识 >说一个大家都知道的 Spring Boot 小细节! 大家都知道 小伙伴们知道

说一个大家都知道的 Spring Boot 小细节! 大家都知道 小伙伴们知道

2024-06-30 21:04:47 [百科] 来源:避面尹邢网

说一个大家都知道的大家都知道 Spring Boot 小细节!

作者:江南一点雨 开发 项目管理 resources 下的小细所有文件都会被打包到项目中,但是大家都知道列出来的那三类,不仅会被打包进来,小细还会参与编译。大家都知道

小伙伴们知道,小细我们在创建 Spring Boot 项目的大家都知道时候,默认都会有一个 parent,小细这个 parent 中帮我们定了项目的大家都知道 JDK 版本、编码格式、小细依赖版本、大家都知道插件版本等各种常见内容,小细有的大家都知道小伙伴可能看过 parent 的源码,这个源码里边有这么一个配置:

<resources>  <resource>    <directory>${ basedir}/src/main/resources</directory>    <filtering>true</filtering>    <includes>      <include>**/application*.yml</include>      <include>**/application*.yaml</include>      <include>**/application*.properties</include>    </includes>  </resource>  <resource>    <directory>${ basedir}/src/main/resources</directory>    <excludes>      <exclude>**/application*.yml</exclude>      <exclude>**/application*.yaml</exclude>      <exclude>**/application*.properties</exclude>    </excludes>  </resource></resources>

首先小伙伴们知道,小细这个配置文件的大家都知道目的主要是为了描述在 maven 打包的时候要不要带上这几个配置文件,但是咋一看,又感觉上面这段配置似乎有点矛盾,松哥来和大家捋一捋就不觉得矛盾了:

说一个大家都知道的 Spring Boot 小细节! 大家都知道 小伙伴们知道

  1. 先来看第一个 resource,directory 就是项目的 resources 目录,includes 中就是我们三种格式的配置文件,另外还有一个 filtering 属性为 true,这是啥意思呢?这其实是说我们在 maven 的 pom.xml 文件中定义的一些变量,可以在 includes 所列出的配置文件中进行引用,也就是说 includes 中列出来的文件,可以参与到项目的编译中。
  2. 第二个 resource,没有 filter,并且将这三个文件排除了,意思是项目在打包的过程中,除了这三类文件之外,其余文件直接拷贝到项目中,不会参与项目编译。

总结一下就是 resources 下的所有文件都会被打包到项目中,但是列出来的那三类,不仅会被打包进来,还会参与编译。

说一个大家都知道的 Spring Boot 小细节! 大家都知道 小伙伴们知道

这下就清晰了,上面这段配置实际上并不矛盾。

说一个大家都知道的 Spring Boot 小细节! 大家都知道 小伙伴们知道

那么在 properties 或者 yaml 中,该如何引用 maven 中的变量呢?

这块原本的写法是使用$ 符号来引用,但是,我们在配置文件中,往往用 $符号来引用当前配置文件的另外一个 key,所以,我们在 Spring Boot 的 parent 中,还会看到下面这行配置:

<properties>  <java.version>17</java.version>  <resource.delimiter>@</resource.delimiter>  <maven.compiler.source>${ java.version}</maven.compiler.source>  <maven.compiler.target>${ java.version}</maven.compiler.target>  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties>

这里的 <resource.delimiter>@</resource.delimiter> 就表示将资源引用的符号改为 @ 符号。也就是在 yaml 或者 properties 文件中,如果我们想引用 pom.xml 中定义的变量,就可以通过 @ 符号来引用。

松哥举一个简单的例子,假设我想在项目的 yaml 文件中配置当前项目的 Java 版本,那么我就可以像下面这样写:

app:  java:    version: @java.version@

这里的 @java.version@ 就表示引用了 pom.xml 中定义的 java.version 变量。

现在我们对项目进行编译,编译之后再打开 application.yaml,内容如下:

图片

可以看到,引用的变量已经被替换了。

按照 Spring Boot parent 中默认的配置,application*.yaml、application*.yml 以及 application*.properties 文件中可以引用 pom.xml 中定义的变量,其他文件则不可以。如果其他文件也想引用,就要额外配置一下。

例如,想让 txt 文件引用 pom.xml 中的变量,我们可以在 pom.xml 中做如下配置:

<build>    <resources>        <resource>            <directory>src/main/resources</directory>            <includes>                <include>**/*.txt</include>            </includes>            <filtering>true</filtering>        </resource>    </resources>    <plugins>        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>        </plugin>    </plugins></build>

include 所有的 txt 文件,并且设置 filtering 为 true(不设置默认为 false),然后我们就可以在 resources 目录下的 txt 文件中引用 pom.xml 中的变量了,像下面这样:

图片

编译之后,这本变量引用就会被替换成真正的值:

图片

在 yaml 中引用 pom.xml 的配置,有一个非常经典的用法,就是多环境切换。

假设我们现在项目中有开发环境、测试环境以及生产环境,对应的配置文件分别是:

  • application-dev.yaml
  • application-test.yaml
  • application-prod.yaml

我们可以在 application.yaml 中指定具体使用哪个配置文件,像下面这样:

spring:  profiles:    active: dev

这个表示使用开发环境的配置文件。

但是有时候我们的环境信息是配置在 pom.xml 中的,例如 pom.xml 中包含如下内容:

<profiles>    <profile>        <id>dev</id>        <properties>            <package.environment>dev</package.environment>        </properties>        <!-- 是否默认 true表示默认-->        <activation>            <activeByDefault>true</activeByDefault>        </activation>    </profile>    <profile>        <id>prod</id>        <properties>            <package.environment>prod</package.environment>        </properties>    </profile>    <profile>        <id>test</id>        <properties>            <package.environment>test</package.environment>        </properties>    </profile></profiles>

这里配置了三个环境,其中默认是 dev(activeByDefault)。那么我们在 application.yaml 中就可以使用 package.environment 来引用当前环境的名称,而不用硬编码。如下:

spring:  profiles:    active: @package.environment@

此时,我们通过 maven 命令对项目打包时,就可以指定当前环境的版本了,例如使用 test 环境,打包命令如下:

mvn package -Ptest

打包之后我们去看 application.yaml,就会发现里边的环境已经是 test 了。

如果你使用的是 IDEA,则也可以手动勾选环境之后点击打包按钮,如下:

图片

可以先勾选上面的环境信息,再点击下面的打包。

好啦,一个小小知识点,因为有小伙伴在微信上问这个问题,就拿出来和大家分享下。

责任编辑:武晓燕 来源: 江南一点雨 Spring项目编译

(责任编辑:焦点)

    推荐文章
    热点阅读