maven中resource配置的实现示例
作者:2021不再有雨
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配置结构
在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.yml
2.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.yaml
2.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配置的实现示例的文章就介绍到这了,更多相关maven resource配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!