最痛的領悟---maven的filtering,includes,excludes標簽用法


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標簽下的子標簽, 一個用於過濾資源,一個用於是否替換占位符屬性, 一般都是搭配使用, 但兩者功能迥異.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM