filtering標簽和includes,excludes標簽都是resource標簽下的標簽,它們經常出入成雙
然而,這兩者根本就是倆東西
filtering用於擴大范圍,什么范圍呢?maven默認只會替換pom文件中的占位符屬性,不會觸碰resources下相關文件的.但filtering=true了,就可以觸碰了.觸碰的效果就是能替換resources下指定文件的占位符屬性.
可是誰來指定文件是哪些呢?這就是includes和excludes的事兒了.
此處可以望文生義, includes和excludes的實際意思就是: 包括和排除
默認情況下,maven打包時會包含resources下所有的文件
如果我們只想讓指定的幾個文件被打包,那就將這幾個文件放在includes標簽下處理
同理: 如果我們不想讓這幾個文件被打包,那就將這幾個文件放在excludes標簽下處理.
========================filtering的單獨使用====================================
1. 沒有使用filtering時:
pom文件中定義在不同激活區的屬性xxx
<profiles>
<profile>
<id>dev</id>
<properties>
<xxx>dev</xxx>
</properties>
</profile>
<profile>
<id>sit</id>
<properties>
<xxx>sit</xxx>
</properties>
</profile>
<profile>
<id>uat</id>
<properties>
<xxx>uat</xxx>
</properties>
</profile>
</profiles>
bootstrap.properties文件中定義的占位符屬性${xxx}
spring.cloud.config.profile=${xxx}
使用-Psit打包后target下對應文件原封不動,沒被替換:
spring.cloud.config.profile=${xxx}
2. 使用filtering后:
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
使用-Psit打包后target下對應文件中${}占位符被替換了:
spring.cloud.config.profile=sit
3.注意點:
項目不能繼承spring-boot-starter-parent,因為這個parent為了防止與pom的占位符沖突,通過maven-resources-plugin將spring使用的資源占位符專門設置為:@ ,如下:
<properties>
<java.version>1.6</java.version>
<resource.delimiter>@</resource.delimiter> <!-- delimiter that doesn't clash with Spring ${} placeholders -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<delimiters>
<delimiter>${resource.delimiter}</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
可通過自己配置plugin覆蓋此處配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>utf-8</encoding>
<!-- 使Spring Boot支持${}占位符 -->
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</build>
=============================includes與excludes的使用==================================
resources下文件有多個:
如果使用了include,
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>dev/</include>
</includes>
</resource>
</resources>
</build>
則打包時進入target的是這樣的:
>>>>
如果使用了exclude,
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<excludes>
<exclude>dev/</exclude>
</excludes>
</resource>
</resources>
</build>
則打包時進入target的是這樣的:
>>>>
如果同時使用了include和exclude,
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>dev/</include>
</includes>
<excludes>
<exclude>dev/application-dev.*</exclude>
</excludes>
</resource>
</resources>
</build>
則打包時是這樣的:
>>>>
一個排除,一個包含,可以各自單獨使用,也可以混合使用,混合使用時,如果范圍有交集,會被排除掉,通常用於過濾掉文件夾中的幾個特殊文件
========================filtering與include,exclude混合使用=================================
既進行資源過濾,又擴大maven屬性占位符替換的范圍,有三種方式:
1.排除資源-------使用excludes排除
2.包括資源, 替換屬性-------使用include包含, 且使用filtering=true過濾
3.包括資源, 不替換屬性-------使用include包含,且不使用filtering過濾
如果這樣用:
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
// 紅色表示資源過濾: 只保留dev文件夾下名字不是application-dev的文件
<includes>
<include>dev/</include>
</includes>
<excludes>
<exclude>dev/application-dev.*</exclude>
</excludes>
// 藍色表示擴大屬性替換范圍: 替換資源過濾最終留下來的文件中的${}占位符屬性
<filtering>true</filtering>
</resource>
</resources>
</build>
那么打包結果:
>>>>
target文件夾下的application-dev2.properties文件的屬性值變化:
spring.cloud.config.profile=${xxx} -----> spring.cloud.config.profile=sit
總結:
1. filtering用於打包時擴大maven替換占位符屬性的范圍, true表示會替換所在resource標簽確定的文件范圍內的占位符屬性
2. include和exclude用於打包時資源過濾, 主要目的是把resources下不想要的文件排除掉,不打進包中.
3. 它倆都是resource標簽下的子標簽, 一個用於過濾資源,一個用於是否替換占位符屬性, 一般都是搭配使用, 但兩者功能迥異.