首先,下面是一個簡單的filtering的應用
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
上面的代碼就是對resources目錄開啟了filtering過濾,那么這個功能到底有什么效果呢?
為了更深入的了解這個filtering
,不妨從是什么?為什么?怎么用?三個方面進行闡述。
filtering
- 是啥:filtering是maven的resource插件中提供的一個功能。
- 為啥:想要解決編碼過程中的配置文件的變量注入的問題,如:在不同的開發環境下要啟用不同的配置屬性,如何靈活的切換?filtering為我們提供了方法。
- 咋用:首先通過上面的例子啟動,之后,就可以在pom文件中定義屬性,並在resources目錄下的配置文件,如application.yml中使用了,具體使用方法見下文詳述。
大致的三個問題已經解決了,那么具體怎么用,有哪幾種用法呢?

下面來詳談一下:
一般來說:
- 在pom文件內部對變量的應用,都通過
${value_name}
的方式,比如常見的:${project.artifactId}
- 在application.yml中對內部變量的引用,通常也是使用
${value_name}
的方式,比如常見的:${server.port}
這樣就導致了一個沖突,兩種配置文件都用同一套標識符,那yaml文件怎么引入pom中的變量呢,於是就有了
resource.delimiter
這個屬性
如果查看spring-boot-starter-parent中的屬性欄,就可以看到赫然寫着:<resource.delimiter>@</resource.delimiter>
這代表了什么?這表示,在yaml中如果要引用pom中的屬性,直接使用@標識符就行了,用法為@value_of_pom@
。
就這樣,所以就出現了第三種變量的引用方式:
- 在resources的yaml文件中引用pom中的變量時,通過
@value_of_pom@
進行引用(前提是開啟了資源的過濾filtering)。

一個突出的應用場景
就是為多個環境進行配置的時候:一般情況下,開發,測試,生產環境是不同的,尤其是其中有一些數據庫的配置,服務發現地址的配置,日志文件的位置等都有所區分。
如果每次一換環境,就手動去一點兒點兒改配置,無疑是耗時耗力的,那么有沒有一種方法,能夠快捷的將環境進行一鍵切換,能夠達到針對不同的運行環境采用不同配置的目的呢?
答案是可以的,就是利用我們的filtering對資源的動態管理。
filtering作為maven-resource插件中的一個功能,其起作用的時機是在maven生命周期中的
resource
階段,這是一個對資源做出處理,先於compile的一個階段。
拓展
一個完整的resource
標簽如下:
<resource> <targetPath>META-INF/plexus</targetPath> <filtering>false</filtering> <directory>${basedir}/src/main/plexus</directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource>
其中包含的標簽含義如下:
- targetPath:指定了資源構建時的目標目錄,默認為base direcory,即source目錄結構下
原文:This is not required if you simply put the resources in that directory structure at the source
- filtering:決定是否將resources目錄下的文件中的tokens(即通過@val@標識的變量)進行參數替換。這里的參數主要有兩個來源,一個是來自於pom文件中的properties屬性,一個是來源於外部的.properties文件(個人認為這個文件不可與springboot中的配置文件混為一談)
那么如何引用外部的.properties文件呢?通過另一個標簽<filters>下的<filter>進行路徑的指定。
- directory:一個相對於POM文件的路徑,指定了resources文件的路徑。
- includes:制定了包含文件的patterns,符合樣式的且在directory目錄下的文件都會包含進編譯好的資源文件中
- excludes:與includes對應,指定不包含在內的模式。如果和includes沖突,優先不包含。
拓展2
一些簡單的maven命令參數:
主要用於切換環境的:
mvn resources:resources -Dfile=my-setting-file
這表示給pom中的file變量賦值為了my-setting-file,如果這個是設定的filter的文件名,即會引入my-setting-file中的設定參數。
mvn clean package -Ptest,jdk8,!os-windows
這表示啟用test,jdk8兩個profile,不激活os-windows。
轉載地址:https://www.jianshu.com/p/4410613bb36f