maven中resource配置的實現(xiàn)示例
1. 使用場景
通常情況下, maven項目中默認資源文件為src/main/resources
和src/test/resources
目錄
但項目中可能會有以下場景:
- 需要添加
src/main/resources
之外的目錄中的配置文件 - 只需要
src/main/resources
中部分配置文件 - 需要對
src/main/resources
中配置文件的變量, 進行placeholder進行解析值替換
這時候, 就需要在pom中配置build.resouces.resouce進行個性化配置
2. 使用語法
2.1 resource配置結(jié)構
在pom中配置中可以配置的元素結(jié)構如下:
<build> <resources> <resource> <directory></directory> <filtering></filtering> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </resource> <resource> ... </resource> </resources> </build>
- 標簽
<directory>
指定資源文件目錄 - 標簽
<includes>
指定資源文件目錄中,僅包含哪些文件被打包 - 標簽
<excludes>
指定資源文件目錄中,僅哪些文件不被打包 - 標簽
<filtering>
是一個bool
值,默認值為false
。指定打包時的配置文件中是否進行變量替換
2.2 配置語法及特殊場景
(示例項目的結(jié)構參考文件最后)
2.2.1 filtering的使用
1.資源文件中使用${keyword}
占位符來定義變量, 如src/main/resouces/application.properties:
application.user=${username} application.password=${password}
2.這時候可以在pom.xml
文件中定義變量的取值
<properties> <username>mysql</username> <password>password123</password> </properties>
3.如果需要對配置文件中變量進行替換實際值,就需要開啟<filtering>
,該值設置為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之間的關系
怎么理解pom中多個resource的關系? 并集? 交集? 還是其他?
先說結(jié)論: 多個resource可以理解為按順序?qū)Χ鄠€resource進行收集資源
測試示例如下: 第一個resource排除application.properties, 第二個resource包含application.properties:
<resources> <!-- 多個resource的關系: 可以理解為依次對多個resource進行收集資源 --> <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é)構:
target/test-resource ├── META-INF └── WEB-INF └── classes ├── application.properties ├── application.xml ├── application.yaml └── application.yml
2.2.3 includes和excludes的關系
一般情況下一個resource中單獨使用其中一個即可滿足要求:
- 標簽
<includes>
指定資源文件目錄中,僅包含哪些文件被打包 - 標簽
<excludes>
指定資源文件目錄中,僅哪些文件不被打包
注意, 上述描述中僅的定義. 當同時存在includes
和excludes
是以哪個為主?
先說結(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 打包默認其他目錄
打包src/main/resources
默認目錄之外的目錄, 指定<directory>
為對應目錄即可
<!-- 場景1:增加默認resource之外的目錄 --> <resource> <directory>src/main/config</directory> <includes> <!-- **表示任意目錄,*.*表示任意文件名和擴展名--> <include>**/*.*</include> </includes> <!-- 表示是否對配置文件中的${}占位符進行解析替換--> <filtering>false</filtering> </resource>
打包得到結(jié)構:
target/test-resource ├── META-INF └── WEB-INF └── classes └── redis.properties
從上述結(jié)果中, 可以得出一個非常重要的結(jié)論:
如果pom中顯式定義了resource, 則要想默認的src/main/resources目錄生效, 必須也顯式額外配置
2.2.5 include和exclude支持通配符
**
表示任意目錄, *.*
表示任意文件名和擴展名
<include>**/*.xml</include> <include>**/*.*</include>
2.2.6 自定義filter占位符
默認的占位符為${}
, 但是為了與其他場景區(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> <!-- 在這里配置配一半即可,即默認開始符和結(jié)束符一樣 --> <delimiter>@</delimiter> </delimiters> <encoding>UTF-8</encoding> </configuration> </plugin>
3. 示例項目的結(jié)構
src └── main ├── config │ └── redis.properties ├── java └── resources ├── application.properties ├── application.xml ├── application.yaml └── application.yml
到此這篇關于maven中resource配置的實現(xiàn)示例的文章就介紹到這了,更多相關maven resource配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Postman form-data、x-www-form-urlencoded的區(qū)別及說明
這篇文章主要介紹了Postman form-data、x-www-form-urlencoded的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03java靜態(tài)工具類注入service出現(xiàn)NullPointerException異常處理
如果我們要在我們自己封裝的Utils工具類中或者非controller普通類中使用@Autowired注解注入Service或者Mapper接口,直接注入是報錯的,因Utils用了靜態(tài)方法,我們無法直接用非靜態(tài)接口的,遇到這問題,我們要想法解決,下面小編就簡單介紹解決辦法,需要的朋友可參考下2021-09-09Java訪問修飾符public、private、protected及默認訪問權限詳解
這篇文章主要介紹了Java訪問修飾符public、private、protected及默認訪問權限的相關資料,每種修飾符都有其特定的使用場景,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-01-01java多線程編程之使用runnable接口創(chuàng)建線程
實現(xiàn)Runnable接口的類必須使用Thread類的實例才能創(chuàng)建線程,通過Runnable接口創(chuàng)建線程分為以下兩步2014-01-01mybatis 返回Integer,Double,String等類型的數(shù)據(jù)操作
這篇文章主要介紹了mybatis 返回Integer,Double,String等類型的數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11