maven的资源插件提供过滤功能,可以在文件中使用占位符,配置对特定目录中的文件进行过滤。默认的占位符是@和${*}(这点可以查看官方的resources goal的配置参数得知)。
通常配置如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.json</include>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
</build>
第一段配置会启用对src/main/resource目录下的文件的过滤功能,该功能默认关闭。
第二段配置指定src/main/java下的任意目录的xml文件、json文件、ftl文件都是资源文件,会被复制的对应目录。
通常SpringBoot所使用的配置文件,如application.properties或applicaion.yml,在配置文件上面使用占位符后,编译输出的文件会替换上具体的值。
需要注意的是,spring-boot-starter-parent的pom文件中有相应的配置:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimiter>${resource.delimiter}</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
它更改了默认的占位符,这时如果不配置资源插件的话,只能用resource.delimiter作为占位符,即@符号。
也可以配置自定义的占位符:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
<delimiter>#{*}</delimiter>
</delimiters>
</configuration>
</plugin>
使用上述配置之后,支持@和#{*},这2个占位符。
SpringBoot支持在yml文件中,使用${变量名:默认值}的形式。使用自定义配置时,最好不要与SpringBoot自带的${}冲突。SpringBoot自带的占位符,是在启动时读入系统属性(java -D所传入的参数)或环境变量(操作系统层面)来替换,而maven的资源过滤插件是编译时就完成替换。
还可以预先制定好properties文件,使用该文件中的键值对来进行过滤替换。
<filters>
<filter>src/main/filters/app.properties</filter>
</filters>
将app.properties中配置的键值对从中取出值,用来过滤具体的文件。
maven资源插件的过滤用法: