一. 概述
在上一篇文章 maven基础知识总结 中描述了如下内容:通过 <filtering>true</filtering> 开启过滤器功能,开启之后就可以从 pom.xml 文件、 <properties> 元素或者 <filters> 中指定的 properties 文件中读取变量的值替换 ${变量名}。
但是在 spring boot 中无法通过 ${变量名} 定义变量,应该使用 @变量名@ 。
通过查看 spring-boot-starter-parent 中的 pom.xml 文件,有如下内容:
二. 在 spring boot 中使用自定义的配置文件
下面通过一个例子来说明上面的功能,定义一个 hello.txt 文件,文件中通过 @变量名@ 方式定义一些变量,用来验证变量替换的功能,定义了 test.txt 用来验证文件排除功能,定义了一个 my.properties 文件指定变量的值,如下图所示:
其中 spring boot 项目的 pom.xml 文件有如下内容:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<!--使用 <excludes> 排除 src/main/resources 目录下的 test.txt 文件 -->
<excludes>
<exclude>test.txt</exclude>
</excludes>
<!--
开启过滤器功能,开启之后就可以从 <properties> 元素
或者下面 <filters>中指定的 properties 文件中读取变量的值
替换 ${变量名}
-->
<filtering>true</filtering>
</resource>
</resources>
<filters>
<filter>src/main/resources/my.properties</filter>
</filters>
</build>
使用 mvn clean package 命令打包,在 target/classes 目录可以看到 test.txt 文件被排除, @变量名@ 也被替换为指定的值,如下图所示:
三、spring-boot-starter-parent.pom 中的 resources 说明
查看 spring-boot-starter-parent.pom 有如下图所示的内容:
一开始并没有看懂这里定义的两个类似的 resource 的意思,但是仔细阅读上述的内容我们就可以明白,下面做一个简单的说明:
第一个 <resource> 配置说明:在 src/main/resources 目录包括子目录下,对 application*.yml 、application*.yaml 以及 application*.properties 这三个文件进行过滤,也就是对这三个文件中的 @变量名@ 进行替换,其他文件不进行替换。(include 是包含的意思)
第二个 <resource> 配置说明:在 src/main/resources 目录包括子目录下,对 application*.yml 、application*.yaml 以及 application*.properties 这三个文件不进行过滤,但是其他文件也是资源文件,它们不会被过滤,其他文件会被引入到 target 目录。(exclude 是排除的意思)
经过测试,如果项目继承自 spring-boot-starter-parent 并且在 pom.xml 文件中重新定义了 <resource> 的配置,那么 spring-boot-starter-parent 中定义的 <resource> 不会生效。