maven中resource配置详解
maven中resource標簽詳解
- 1. 使用場景
- 2. 使用語法
- 2.1 resource配置結構
- 2.2 配置語法及特殊場景
- 2.2.1 filtering的使用
- 2.2.2 resource之間的關系
- 2.2.3 includes和excludes的關系
- 2.2.4 打包默認其他目錄
- 2.2.5 include和exclude支持通配符
- 2.2.6 自定義filter占位符
- 3. 示例項目的結構
1. 使用場景
通常情況下, maven項目中默認資源文件為src/main/resources和src/test/resources目錄
但項目中可能會有以下場景:
這時候, 就需要在pom中配置build.resouces.resouce進行個性化配置
2. 使用語法
2.1 resource配置結構
在pom中配置中可以配置的元素結構如下:
<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 配置語法及特殊場景
(示例項目的結構參考文件最后)
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的關系? 并集? 交集? 還是其他?
先說結論: 多個resource可以理解為按順序對多個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>打包后, 得到如下結構:
target/test-resource ├── META-INF └── WEB-INF└── classes├── application.properties├── application.xml├── application.yaml└── application.yml2.2.3 includes和excludes的關系
一般情況下一個resource中單獨使用其中一個即可滿足要求:
- 標簽 <includes>指定資源文件目錄中,僅包含哪些文件被打包
- 標簽<excludes>指定資源文件目錄中,僅哪些文件不被打包
注意, 上述描述中僅的定義. 當同時存在includes和excludes是以哪個為主?
先說結論: 取兩者描述資源的交集
測試示例:
<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>打包后得到結果:
target/test-resource ├── META-INF └── WEB-INF└── classes├── application.xml└── application.yaml2.2.4 打包默認其他目錄
打包src/main/resources默認目錄之外的目錄, 指定<directory>為對應目錄即可
<!-- 場景1:增加默認resource之外的目錄 --><resource><directory>src/main/config</directory><includes><!-- **表示任意目錄,*.*表示任意文件名和擴展名--><include>**/*.*</include></includes><!-- 表示是否對配置文件中的${}占位符進行解析替換--><filtering>false</filtering></resource>打包得到結構:
target/test-resource ├── META-INF └── WEB-INF└── classes└── redis.properties從上述結果中, 可以得出一個非常重要的結論:
如果pom中顯式定義了resource, 則要想默認的src/main/resources目錄生效, 必須也顯式額外配置
2.2.5 include和exclude支持通配符
** 表示任意目錄, *.*表示任意文件名和擴展名
<include>**/*.xml</include> <include>**/*.*</include>2.2.6 自定義filter占位符
默認的占位符為${}, 但是為了與其他場景區分(如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文件內容:
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><!-- 在這里配置配一半即可,即默認開始符和結束符一樣 --><delimiter>@</delimiter></delimiters><encoding>UTF-8</encoding></configuration> </plugin>3. 示例項目的結構
src └── main├── config│ └── redis.properties├── java└── resources├── application.properties├── application.xml├── application.yaml└── application.yml總結
以上是生活随笔為你收集整理的maven中resource配置详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【华为面试手撕代码】
- 下一篇: TrueType字体文件解析和字体光栅化