maven中resource配置使用詳解
maven中resource標(biāo)簽詳解
1. 使用場景
通常情況下, maven項(xiàng)目中默認(rèn)資源文件為src/main/resources
和src/test/resources
目錄
但項(xiàng)目中可能會有以下場景:
- 需要添加
src/main/resources
之外的目錄中的配置文件 - 只需要
src/main/resources
中部分配置文件 - 需要對
src/main/resources
中配置文件的變量, 進(jìn)行placeholder進(jìn)行解析值替換
這時(shí)候, 就需要在pom中配置build.resouces.resouce進(jìn)行個(gè)性化配置
2. 使用語法
2.1 resource配置結(jié)構(gòu)
在pom中配置中可以配置的元素結(jié)構(gòu)如下:
<build> <resources> <resource> <directory></directory> <filtering></filtering> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </resource> <resource> ... </resource> </resources> </build>
- 標(biāo)簽
<directory>
指定資源文件目錄 - 標(biāo)簽
<includes>
指定資源文件目錄中,僅包含哪些文件被打包 - 標(biāo)簽
<excludes>
指定資源文件目錄中,僅哪些文件不被打包 - 標(biāo)簽
<filtering>
是一個(gè)bool
值,默認(rèn)值為false
。指定打包時(shí)的配置文件中是否進(jìn)行變量替換
2.2 配置語法及特殊場景
(示例項(xiàng)目的結(jié)構(gòu)參考文件最后)
2.2.1 filtering的使用
1.資源文件中使用${keyword}
占位符來定義變量, 如src/main/resouces/application.properties:
application.user=${username} application.password=${password}
2.這時(shí)候可以在pom.xml
文件中定義變量的取值
<properties> <username>mysql</username> <password>password123</password> </properties>
3.如果需要對配置文件中變量進(jìn)行替換實(shí)際值,就需要開啟<filtering>
,該值設(shè)置為true
。
<resource> <directory>src/main/resources</directory> <includes> <include>application.properties</include> </includes> <filtering>true</filtering> </resource>
打包后, 資源文件src/main/resouces/application.properties:
application.user=mysql application.password=mysql
另, 變量的定義可以不放在pom里, 也可以指定其他文件, 通過build.filters.filter配置即可. 示例:
<build> <finalName>test-maven-resource</finalName> <filters> <filter>src/main/config/${active.profile}/zookeeper.properties</filter> <filter>src/main/config/${active.profile}/xdcs.properties</filter> <filter>src/main/config/${active.profile}/maven-test.properties</filter> <filter>src/main/config/${active.profile}/web.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> <resource> <directory>src/main/config/${active.profile}</directory> <filtering>false</filtering> </resource> </resources>
2.2.2 resource之間的關(guān)系
怎么理解pom中多個(gè)resource的關(guān)系? 并集? 交集? 還是其他?
先說結(jié)論: 多個(gè)resource可以理解為按順序?qū)Χ鄠€(gè)resource進(jìn)行收集資源
測試示例如下: 第一個(gè)resource排除application.properties, 第二個(gè)resource包含application.properties:
<resources> <!-- 多個(gè)resource的關(guān)系: 可以理解為依次對多個(gè)resource進(jìn)行收集資源 --> <resource> <directory>src/main/resources</directory> <excludes> <exclude>application.properties</exclude> </excludes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>application.properties</include> </includes> <filtering>true</filtering> </resource> </resources>
打包后, 得到如下結(jié)構(gòu):
target/test-resource ├── META-INF └── WEB-INF └── classes ├── application.properties ├── application.xml ├── application.yaml └── application.yml
2.2.3 includes和excludes的關(guān)系
一般情況下一個(gè)resource中單獨(dú)使用其中一個(gè)即可滿足要求:
- 標(biāo)簽
<includes>
指定資源文件目錄中,僅包含哪些文件被打包 - 標(biāo)簽
<excludes>
指定資源文件目錄中,僅哪些文件不被打包
注意, 上述描述中僅的定義. 當(dāng)同時(shí)存在includes
和excludes
是以哪個(gè)為主?
先說結(jié)論: 取兩者描述資源的交集
測試示例:
<resource> <directory>src/main/resources</directory> <excludes> <exclude>application.properties</exclude> </excludes> <includes> <include>application.yaml</include> <include>application.xml</include> </includes> <filtering>false</filtering> </resource>
打包后得到結(jié)果:
target/test-resource
├── META-INF
└── WEB-INF
└── classes
├── application.xml
└── application.yaml
2.2.4 打包默認(rèn)其他目錄
打包src/main/resources
默認(rèn)目錄之外的目錄, 指定<directory>
為對應(yīng)目錄即可
<!-- 場景1:增加默認(rèn)resource之外的目錄 --> <resource> <directory>src/main/config</directory> <includes> <!-- **表示任意目錄,*.*表示任意文件名和擴(kuò)展名--> <include>**/*.*</include> </includes> <!-- 表示是否對配置文件中的${}占位符進(jìn)行解析替換--> <filtering>false</filtering> </resource>
打包得到結(jié)構(gòu):
target/test-resource ├── META-INF └── WEB-INF └── classes └── redis.properties
從上述結(jié)果中, 可以得出一個(gè)非常重要的結(jié)論:
如果pom中顯式定義了resource, 則要想默認(rèn)的src/main/resources目錄生效, 必須也顯式額外配置
2.2.5 include和exclude支持通配符
**
表示任意目錄, *.*
表示任意文件名和擴(kuò)展名
<include>**/*.xml</include> <include>**/*.*</include>
2.2.6 自定義filter占位符
默認(rèn)的占位符為${}
, 但是為了與其他場景區(qū)分(如spring), 可能需要自定義占位符.
只需要顯式定義<resource.delimiter>
的properties即可.
<properties> <username>mysql</username> <password>admin</password> <resource.delimiter>@@</resource.delimiter> </properties> <build> <finalName>test-resource</finalName> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>application.properties</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
application.properties文件內(nèi)容:
application.user=@username@ application.password=@password@
還可以在maven-resources-plugin
插件的configuration中配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.5</version> <configuration> <useDefaultDelimiters>false</useDefaultDelimiters> <delimiters> <!-- 在這里配置配一半即可,即默認(rèn)開始符和結(jié)束符一樣 --> <delimiter>@</delimiter> </delimiters> <encoding>UTF-8</encoding> </configuration> </plugin>
3. 示例項(xiàng)目的結(jié)構(gòu)
src └── main ├── config │ └── redis.properties ├── java └── resources ├── application.properties ├── application.xml ├── application.yaml └── application.yml
到此這篇關(guān)于maven中resource配置詳解的文章就介紹到這了,更多相關(guān)maven resource配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java定時(shí)任務(wù)實(shí)現(xiàn)優(yōu)惠碼的示例代碼
在Java中實(shí)現(xiàn)定時(shí)任務(wù)來發(fā)放優(yōu)惠碼,我們可以使用多種方法,比如使用java.util.Timer類、ScheduledExecutorService接口,或者更高級的框架如Spring的@Scheduled注解,這篇文章主要介紹了Java定時(shí)任務(wù)實(shí)現(xiàn)優(yōu)惠碼的實(shí)例,需要的朋友可以參考下2024-07-07Java Lombok簡介、使用、工作原理、優(yōu)缺點(diǎn)
這篇文章主要介紹了Java Lombok簡介、使用、工作原理、優(yōu)缺點(diǎn)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java Lombok,感興趣的朋友可以了解下2021-03-03java+selenium實(shí)現(xiàn)自動化打開頁面的方法
今天小編就為大家分享一篇java+selenium實(shí)現(xiàn)自動化打開頁面的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Springboot2.7+Minio8 實(shí)現(xiàn)大文件分片上傳
本文主要介紹了Springboot2.7+Minio8 實(shí)現(xiàn)大文件分片上傳,通過文件切片上傳,我們能夠提高文件上傳的速度,優(yōu)化用戶體驗(yàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12spring security數(shù)據(jù)庫表結(jié)構(gòu)實(shí)例代碼
這篇文章主要介紹了spring security數(shù)據(jù)庫表結(jié)構(gòu)實(shí)例代碼,需要的朋友可以參考下2017-09-09springcloud?gateway實(shí)現(xiàn)簡易版灰度路由步驟詳解
這篇文章主要為大家介紹了springcloud?gateway實(shí)現(xiàn)簡易版灰度路由步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Java線程的start方法回調(diào)run方法的操作技巧
面試過程中經(jīng)常會被面試官問到為什么我們調(diào)用start()方法時(shí)會執(zhí)行run()方法,為什么不能直接調(diào)用run()方法,問的一頭霧水,今天小編給大家介紹下Java線程的start方法回調(diào)run方法的操作技巧,需要的朋友參考下吧2017-11-11SpringBoot接收數(shù)組參數(shù)和集合參數(shù)方式
這篇文章主要介紹了SpringBoot接收數(shù)組參數(shù)和集合參數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03Java實(shí)現(xiàn)的可選擇及拖拽圖片的面板功能【基于swing組件】
這篇文章主要介紹了Java實(shí)現(xiàn)的可選擇及拖拽圖片的面板功能,涉及java基于swing組件選擇與操作圖片元素的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01