Maven項(xiàng)目中resources配置總結(jié)
背景
通常Maven項(xiàng)目的文件目錄結(jié)構(gòu)如下:
# Maven項(xiàng)目的標(biāo)準(zhǔn)目錄結(jié)構(gòu) src main java #源文件 resources #資源文件 filters #資源過(guò)濾文件 config #配置文件 scripts #腳本文件 webapp #web應(yīng)用文件 test java #測(cè)試源文件 resources #測(cè)試資源文件 filters #測(cè)試資源過(guò)濾文件 it #集成測(cè)試 assembly #assembly descriptors site #Site target generated-sources classes generated-test-sources test-classes xxx.jar pom.xml LICENSE.txt NOTICE.txt README.txt
其中src/main/resources和src/test/resources是資源文件目錄。本文將詳細(xì)介紹資源文件相關(guān)的配置。
第一部分 基本配置介紹
我們?cè)谑褂肕aven組件來(lái)構(gòu)建項(xiàng)目的時(shí)候,通常將配置文件放在資源文件目錄下。針對(duì)這個(gè)目錄,在pom.xml文件進(jìn)行了定義,我們首先看一個(gè)案例:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>application.properties</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>application.properties</exclude> </excludes> </resource> </resources> </build>
- 標(biāo)簽
<directory>指定資源文件目錄; - 標(biāo)簽
<include>指定資源文件目錄中,哪些文件被打包。 - 標(biāo)簽
<excludes>指定資源文件目錄中,哪些文件不被打包。
特別的,標(biāo)簽<filtering>是一個(gè)bool值,默認(rèn)值為false。在maven資源文件中,支持使用變量placeholder,例如資源文件:
# application.properties
application.user=${username}
application.password=${password}
文件中使用${keyword}占位符來(lái)標(biāo)識(shí)變量。這時(shí)候可以在pom.xml文件中定義變量的取值:
<properties> <username>mysql</username> <password>password123</password> </properties>
如果需要對(duì)配置文件中變量進(jìn)行替換實(shí)際值,就需要開(kāi)啟<filtering>,該值設(shè)置為true。
第二部分 具體配置和注意事項(xiàng)
2.1 案例說(shuō)明
根據(jù)上面的介紹,最開(kāi)始例子中有兩段resource的配置描述,分別的含義為:
- 第一個(gè)配置的含義是:在配置文件目錄
src/main/resources過(guò)濾掉其他文件,只保留application.properties文件。并且開(kāi)啟filtering變量替換屬性。 - 第二個(gè)配置的含義是:在配置文件目錄
src/main/resources過(guò)濾掉application.properties文件,其他文件均保留。并且關(guān)閉filtering變量替換屬性。
需要特別注意的是,這里兩個(gè)<resources>都是對(duì)資源目錄<src/main/resources>的配置定義,一個(gè)是保留application.properties,一個(gè)是去除application.properties。這樣兩個(gè)配置會(huì)不會(huì)沖突?實(shí)際上兩個(gè)配置是兼容。最后是取兩個(gè)配置分別過(guò)濾的文件集合的并集。
可以看一下例子,資源目錄src/main/resources里面有三個(gè)文件:
application.yml application.properties application.xml
編譯后,target/classes路徑中三個(gè)配置文件都是有的。第一配置文件過(guò)濾后文件集合為{application.properties},第二個(gè)配置過(guò)濾后的集合為{application.yml,application.xml},最后取并集就得到了最后編譯結(jié)果。
2.2 正則過(guò)濾
在對(duì)資源目錄中文件進(jìn)行過(guò)濾時(shí),還支持正則表達(dá)式。例如:
<include>**/*.xml</include>
這個(gè)表達(dá)式表示包含了資源目錄下面所有xml文件(以及子目錄下面)。
2.3 變量占位符
這里主要指的是<filtering>的功能。例如下面的xml文件定義了一個(gè)研發(fā)<profile>。
<profiles>
<profile>
<id>dev</id>
<properties>
<resource.delimiter>${}</resource.delimiter>
<username>mysql</username>
<password>password123</password>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
配置中定義的username和password兩個(gè)變量的值。使用package -P dev編譯后,配置文件中占位符變量被替換:
application.user=mysql application.password=password123
需要注意的是這里增加了<resource.delimiter>標(biāo)簽配置,定義了占位符的格式。有些時(shí)候其他依賴(lài)包的pom文件也會(huì)指定占位符的格式,就會(huì)造成格式不統(tǒng)一。例如:spring boot把默認(rèn)的占位符號(hào)${}改成了@var@。所以建議進(jìn)行配置,否則容易環(huán)境"污染"。
2.4 關(guān)于一個(gè)錯(cuò)誤觀點(diǎn)的說(shuō)明
有很多關(guān)于這個(gè)主題的文章(例如CSND)中,認(rèn)為同一個(gè)<resource>中,若是<include>和<exclude>都存在的話(huà),那就發(fā)生沖突了,這時(shí)會(huì)以<exclude>為準(zhǔn)。
關(guān)于這個(gè)論點(diǎn),筆者實(shí)際做了實(shí)驗(yàn),同一個(gè)<resource>中,同時(shí)配置了<include>和<exclude>。
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>application.properties</include> </includes> <excludes> <exclude>application.properties</exclude> </excludes> </resource> </resources> </build>
編譯結(jié)果,配置文件沒(méi)有打包進(jìn)入target/classes。說(shuō)明這個(gè)論點(diǎn)是有問(wèn)題的。說(shuō)明在同一個(gè)resource中兩種配置是取交集的。
2.5 子目錄
資源目錄也是支持子目錄的。即可以在資源目錄下面創(chuàng)建子目錄,在打包過(guò)程中會(huì)保留子目錄結(jié)構(gòu)。例如:
resources -test --app.xml -application.yml -application.properties -application.xml
在項(xiàng)目編譯后,如果子目錄中資源文件被保留,那么子目錄的結(jié)構(gòu)也是保留的。例如:
target -classes --test ---app.xml -application.yml -application.properties -application.xml
第二部分 讀取resources資源
例如我們的配置文件properties類(lèi)型的配置文件,可以使用下面的語(yǔ)句進(jìn)行讀取:
方法1,從編譯后的整個(gè)classes目錄下去找;
InputStream is = this.getClass().getResourceAsStream("/" +application.properties);
方法2,ClassLoader從整個(gè)classes目錄找;
InputStream is = this.getClass().getClassLoader().getResourceAsStream(application.properties);
讀取使用Java的工具包java.util.Properties:
import java.util.Properties;
Properties properties = new Properties();
InputStream is = this.getClass().getClassLoader().getResourceAsStream(application.properties);
properties.load(is)
//獲取配置文件中name的配置值
System.out.println(properties.get(getProperty("name")))
其他類(lèi)型的配置文件讀取讀者可以執(zhí)行查找資料。
參考文獻(xiàn)及資料
1、Maven Resources Plugin,鏈接:https://maven.apache.org/components/plugins-archives/maven-resources-plugin-2.6/
2、Maven資源過(guò)濾的配置,鏈接:http://c.biancheng.net/view/5285.html
到此這篇關(guān)于Maven項(xiàng)目中resources配置總結(jié)的文章就介紹到這了,更多相關(guān)Maven resources配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 實(shí)現(xiàn)輸出隨機(jī)圖片實(shí)例代碼
這篇文章主要介紹了java 實(shí)現(xiàn)輸出隨機(jī)圖片實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-06-06
Java IO文件編碼轉(zhuǎn)換實(shí)現(xiàn)代碼
這篇文章主要介紹了Java IO文件編碼轉(zhuǎn)換實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-12-12
java網(wǎng)上商城開(kāi)發(fā)之郵件發(fā)送功能(全)
這篇文章主要介紹了java網(wǎng)上商城開(kāi)發(fā)之郵件發(fā)送功能,第一部分介紹了環(huán)境配置,第二部分則介紹了具體實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-03-03
Java8 Optional判空詳解(簡(jiǎn)化判空操作)
這篇文章主要給大家介紹了關(guān)于Java8 Optional判空(簡(jiǎn)化判空操作)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Java發(fā)送https請(qǐng)求代碼實(shí)例
這篇文章主要介紹了Java發(fā)送https請(qǐng)求代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
責(zé)任鏈模式是一種行為設(shè)計(jì)模式,允許你將請(qǐng)求沿著處理鏈發(fā)送,然后處理者都可對(duì)其進(jìn)行處理,完成后可以再將其傳遞給下一個(gè)處理者。下面將會(huì)舉例說(shuō)明什么是責(zé)任鏈模式,責(zé)任鏈模式該如何使用2022-08-08
Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析
這篇文章主要介紹了Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01

