通常情况下, maven项目中默认资源文件为src/main/resources
和src/test/resources
目录
但项目中可能会有以下场景:
- 需要添加
src/main/resources
之外的目录中的配置文件- 只需要
src/main/resources
中部分配置文件- 需要对
src/main/resources
中配置文件的变量, 进行placeholder进行解析值替换
这时候, 就需要在pom中配置build.resouces.resouce进行个性化配置
在pom中配置中可以配置的元素结构如下:
<build>
<resources>
<resource>
<directory>directory>
<filtering>filtering>
<includes>
<include>include>
includes>
<excludes>
<exclude>exclude>
excludes>
resource>
<resource>
...
resource>
resources>
build>
- 标签
指定资源文件目录
- 标签
指定资源文件目录中,仅包含哪些文件被打包
- 标签
指定资源文件目录中,仅哪些文件不被打包
- 标签
是一个
bool
值,默认值为false
。指定打包时的配置文件中是否进行变量替换
(示例项目的结构参考文件最后)
1.资源文件中使用${keyword}
占位符来定义变量, 如src/main/resouces/application.properties:
application.user=${username}
application.password=${password}
2.这时候可以在pom.xml
文件中定义变量的取值
mysql
password123
3.如果需要对配置文件中变量进行替换实际值,就需要开启
,该值设置为true
。
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>application.propertiesinclude>
includes>
<filtering>truefiltering>
resource>
打包后, 资源文件src/main/resouces/application.properties:
application.user=mysql
application.password=mysql
另, 变量的定义可以不放在pom里, 也可以指定其他文件, 通过build.filters.filter配置即可. 示例:
<build>
<finalName>test-maven-resourcefinalName>
<filters>
<filter>src/main/config/${active.profile}/zookeeper.propertiesfilter>
<filter>src/main/config/${active.profile}/xdcs.propertiesfilter>
<filter>src/main/config/${active.profile}/maven-test.propertiesfilter>
<filter>src/main/config/${active.profile}/web.propertiesfilter>
filters>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
<resource>
<directory>src/main/config/${active.profile}directory>
<filtering>falsefiltering>
resource>
resources>
怎么理解pom中多个resource的关系? 并集? 交集? 还是其他?
先说结论: 多个resource可以理解为按顺序对多个resource进行收集资源
测试示例如下: 第一个resource排除application.properties, 第二个resource包含application.properties:
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<excludes>
<exclude>application.propertiesexclude>
excludes>
<filtering>falsefiltering>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>application.propertiesinclude>
includes>
<filtering>truefiltering>
resource>
resources>
打包后, 得到如下结构:
target/test-resource
├── META-INF
└── WEB-INF
└── classes
├── application.properties
├── application.xml
├── application.yaml
└── application.yml
一般情况下一个resource中单独使用其中一个即可满足要求:
- 标签
指定资源文件目录中,仅包含哪些文件被打包
- 标签
指定资源文件目录中,仅哪些文件不被打包
注意, 上述描述中仅的定义. 当同时存在includes
和excludes
是以哪个为主?
先说结论: 取两者描述资源的交集
测试示例:
<resource>
<directory>src/main/resourcesdirectory>
<excludes>
<exclude>application.propertiesexclude>
excludes>
<includes>
<include>application.yamlinclude>
<include>application.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
打包后得到结果:
target/test-resource
├── META-INF
└── WEB-INF
└── classes
├── application.xml
└── application.yaml
打包src/main/resources
默认目录之外的目录, 指定
为对应目录即可
<resource>
<directory>src/main/configdirectory>
<includes>
<include>**/*.*include>
includes>
<filtering>falsefiltering>
resource>
打包得到结构:
target/test-resource
├── META-INF
└── WEB-INF
└── classes
└── redis.properties
从上述结果中, 可以得出一个非常重要的结论:
如果pom中显式定义了resource, 则要想默认的src/main/resources目录生效, 必须也显式额外配置
**
表示任意目录, *.*
表示任意文件名和扩展名
**/*.xml
**/*.*
默认的占位符为${}
, 但是为了与其他场景区分(如spring), 可能需要自定义占位符.
只需要显式定义
的properties即可.
<properties>
<username>mysqlusername>
<password>adminpassword>
<resource.delimiter>@@resource.delimiter>
properties>
<build>
<finalName>test-resourcefinalName>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>application.propertiesinclude>
includes>
<filtering>truefiltering>
resource>
resources>
build>
application.properties文件内容:
application.user=@username@
application.password=@password@
还可以在maven-resources-plugin
插件的configuration中配置:
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<version>2.5version>
<configuration>
<useDefaultDelimiters>falseuseDefaultDelimiters>
<delimiters>
<delimiter>@delimiter>
delimiters>
<encoding>UTF-8encoding>
configuration>
plugin>
src
└── main
├── config
│ └── redis.properties
├── java
└── resources
├── application.properties
├── application.xml
├── application.yaml
└── application.yml