pom文件 中的filtering作用


首先,下面是一個簡單的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


免責聲明!

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



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