淺談Maven resrouce下filtering作用
filtering 作用
- 是啥:filtering是maven的resource插件中提供的一個(gè)功能。
- 為啥:想要解決編碼過(guò)程中的配置文件的變量注入的問(wèn)題,如:在不同的開(kāi)發(fā)環(huán)境下要啟用不同的配置屬性,如何靈活的切換?filtering為我們提供了方法。
- 咋用:首先通過(guò)上面的例子啟動(dòng),之后,就可以在pom文件中定義屬性,并在resources目錄下的配置文件,如application.yml中使用了,具體使用方法見(jiàn)下文詳述。
作用一 引入pom和resource 資源文件的變量預(yù)編譯配置
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
上面的代碼就是對(duì)resources目錄開(kāi)啟了filtering過(guò)濾,不添加filtering ,默認(rèn)認(rèn)值為false。那么這個(gè)功能到底有什么效果呢?,
為了更深入的了解這個(gè)filtering,不妨從是什么?為什么?怎么用?三個(gè)方面進(jìn)行闡述。
1.pom文件 讀取pom文件內(nèi)部的變量
- 在pom文件內(nèi)部對(duì)變量的應(yīng)用,都通過(guò) v a l u e n a m e 的方式,比如常見(jiàn)的: {value_name}的方式,比如常見(jiàn)的: valuen?ame的方式,比如常見(jiàn)的:{project.artifactId}
2.application.yml 文件讀取application.yml 文件內(nèi)部的變量方式
- 在application.yml中對(duì)內(nèi)部變量的引用,通常也是使用${value_name}的方式,比如常見(jiàn)的:${server.port}
這樣就導(dǎo)致了一個(gè)沖突,兩種配置文件都用同一套標(biāo)識(shí)符,那yaml文件怎么引入pom中的變量呢,于是就有了resource.delimiter這個(gè)屬性
3.yaml文件讀取pom文件的變量方式
如果查看spring-boot-starter-parent中的屬性欄,就可以看到赫然寫(xiě)著:
<resource.delimiter>@</resource.delimiter>
這代表了什么?這表示,在yaml中如果要引用pom中的屬性,直接使用@標(biāo)識(shí)符就行了,用法為@value_of_pom@。
就這樣,所以就出現(xiàn)了第三種變量的引用方式:
- 在resources的yaml文件中引用pom中的變量時(shí),通過(guò)@value_of_pom@進(jìn)行引用(前提是開(kāi)啟了資源的過(guò)濾filtering)。
應(yīng)用場(chǎng)景
就是為多個(gè)環(huán)境進(jìn)行配置的時(shí)候:一般情況下,開(kāi)發(fā),測(cè)試,生產(chǎn)環(huán)境是不同的,尤其是其中有一些數(shù)據(jù)庫(kù)的配置,服務(wù)發(fā)現(xiàn)地址的配置,日志文件的位置等都有所區(qū)分。
如果每次一換環(huán)境,就手動(dòng)去一點(diǎn)兒點(diǎn)兒改配置,無(wú)疑是耗時(shí)耗力的,那么有沒(méi)有一種方法,能夠快捷的將環(huán)境進(jìn)行一鍵切換,能夠達(dá)到針對(duì)不同的運(yùn)行環(huán)境采用不同配置的目的呢?
答案是可以的,就是利用我們的filtering對(duì)資源的動(dòng)態(tài)管理。
filtering作為maven-resource插件中的一個(gè)功能,其起作用的時(shí)機(jī)是在maven生命周期中的resource階段,這是一個(gè)對(duì)資源做出處理,先于compile的一個(gè)階段。
4.pom文件讀取 .properties文件的變量
在Maven項(xiàng)目的pom.xml中,你可以使用元素來(lái)定義變量,并使用來(lái)指定資源文件的位置。如果你想要在pom.xml中讀取.properties文件中的變量,可以使用Maven的filtering功能。
以下是一個(gè)簡(jiǎn)單的例子:
在src/main/resources目錄下創(chuàng)建一個(gè).properties文件,比如config.properties。
src/main/resources/config.properties
database.url=jdbc:mysql://localhost/mydb database.user=myuser database.password=mypassword
在pom.xml中配置資源過(guò)濾和元素。
<project> ... <properties> <database.url>${database.url}</database.url> <database.user>${database.user}</database.user> <database.password>${database.password}</database.password> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> ... </project>
filtering:決定是否將resources目錄下的文件中的tokens(即通過(guò)@val@標(biāo)識(shí)的變量)進(jìn)行參數(shù)替換。這里的參數(shù)主要有兩個(gè)來(lái)源,一個(gè)是來(lái)自于pom文件中的properties屬性,一個(gè)是來(lái)源于外部的.properties文件(個(gè)人認(rèn)為這個(gè)文件不可與springboot中的配置文件混為一談)
那么如何引用外部的.properties文件呢?通過(guò)另一個(gè)標(biāo)簽下的進(jìn)行路徑的指定。
作用二 開(kāi)啟resource 打包資源文件的過(guò)濾
通過(guò)includes和 excludes 標(biāo)簽進(jìn)行打包資源文件的過(guò)濾
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>a.properties</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <!--filtering標(biāo)簽的值默認(rèn)是false,在這里可寫(xiě)可不寫(xiě)--> <filtering>false</filtering> <excludes> <exclude>a.properties</exclude> </excludes> </resource> </resources> </build>
一些maven命令參數(shù)
主要用于切換環(huán)境的:
mvn resources:resources -Dfile=my-setting-file
這表示給pom中的file變量賦值為了my-setting-file,如果這個(gè)是設(shè)定的filter的文件名,即會(huì)引入my-setting-file中的設(shè)定參數(shù)。
mvn clean package -Ptest,jdk8,!os-windows
這表示啟用test,jdk8兩個(gè)profile,不激活os-windows。
到此這篇關(guān)于淺談Maven resrouce下filtering作用的文章就介紹到這了,更多相關(guān)Maven resrouce filtering作用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編程中使用XFire框架調(diào)用WebService程序接口
這篇文章主要介紹了Java編程中使用XFire調(diào)用WebService程序接口的方法,WebService是一種跨編程語(yǔ)言和跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù),需要的朋友可以參考下2015-12-12Java 詳解循環(huán)屏障CyclicBarrier如何實(shí)現(xiàn)多線程分段等待執(zhí)行完成
CyclicBarrier是一個(gè)同步工具類(lèi),可以翻譯成循環(huán)屏障,也叫障礙器或同步屏障。CyclicBarrier內(nèi)部有一個(gè)計(jì)數(shù)器count,調(diào)用障礙器的await方法會(huì)使計(jì)數(shù)器count的值減一,當(dāng)計(jì)數(shù)器count的值為0時(shí),表明調(diào)用了await方法線程已經(jīng)達(dá)到了設(shè)置的數(shù)量2021-11-11詳解java數(shù)據(jù)結(jié)構(gòu)與算法之雙鏈表設(shè)計(jì)與實(shí)現(xiàn)
本篇文章主要介紹了詳解java數(shù)據(jù)結(jié)構(gòu)與算法之雙鏈表設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06java驗(yàn)證用戶(hù)是否已經(jīng)登錄 java實(shí)現(xiàn)自動(dòng)登錄
這篇文章主要介紹了java驗(yàn)證用戶(hù)是否已經(jīng)登錄,java實(shí)現(xiàn)自動(dòng)登錄,感興趣的小伙伴們可以參考一下2016-04-04Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系
今天小編就為大家分享一篇關(guān)于Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03eclipse下搭建hibernate5.0環(huán)境的步驟(圖文)
這篇文章主要介紹了eclipse下搭建hibernate5.0環(huán)境的步驟(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式
這篇文章主要給大家分享的是Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式,幾乎在所有的項(xiàng)目中,定時(shí)任務(wù)的使用都是不可或缺的,如果使用不當(dāng)甚至?xí)斐少Y損,下面文章我們就來(lái)看看Java中定時(shí)任務(wù)的具體使用方式吧2021-10-10詳解使用SSM實(shí)現(xiàn)簡(jiǎn)單工作流系統(tǒng)之實(shí)現(xiàn)篇
這篇文章主要介紹了使用SSM實(shí)現(xiàn)簡(jiǎn)單工作流系統(tǒng)之實(shí)現(xiàn)篇,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12