Maven resources资源配置详解
Maven 资源配置详解
一、配置说明
在 Maven 中,资源文件(如配置文件、属性文件等)通过 <resources>
配置管理,主要控制:
- 资源目录位置
- 文件过滤(变量替换)
- 包含/排除规则
- 多模块优先级
二、基础配置样例
<build><resources><!-- 主资源目录配置 --><resource><directory>src/main/resources</directory> <!-- 资源路径 --><filtering>true</filtering> <!-- 启用变量替换 --><includes> <!-- 包含规则 --><include>**/*.properties</include><include>config/*.xml</include></includes><excludes> <!-- 排除规则 --><exclude>**/test.*</exclude></excludes></resource><!-- 添加额外资源目录 --><resource><directory>src/main/config</directory><filtering>false</filtering></resource></resources><!-- 测试资源独立配置 --><testResources><testResource><directory>src/test/resources</directory></testResource></testResources>
</build>
三、多项目配置规则与优先级
1. 父子模块配置原则
配置位置 | 生效范围 | 优先级 |
---|---|---|
父 POM | 所有子模块(默认继承) | 低 |
子模块 POM | 仅当前模块 | 高 |
子模块显式配置 | 覆盖父 POM 配置 | 最高 |
2. 覆盖规则示例
父 POM:
<resources><resource><directory>parent-resources</directory></resource>
</resources>
子模块 POM (覆盖父配置):
<resources><!-- 父配置被完全覆盖,仅当前配置生效 --><resource><directory>child-resources</directory></resource>
</resources>
子模块合并配置 (显式包含父资源):
<resources><!-- 手动包含父资源目录 --><resource><directory>../parent-resources</directory></resource><!-- 子模块自有资源 --><resource><directory>child-resources</directory></resource>
</resources>
四、生效规则详解
1. 目录生效顺序
- 文件覆盖:同名文件按配置顺序,后处理的覆盖先处理的
- 目录独立:不同目录的文件会合并到输出目录
2. 过滤规则(filtering)
- 开启过滤 (
<filtering>true</filtering>
):- 替换资源文件中的
${property}
占位符 - 属性来源:
pom.xml
属性、settings.xml
、系统属性、外部属性文件
- 替换资源文件中的
- 过滤作用域:仅对当前
<resource>
生效
3. 包含/排除规则
- 规则使用 Ant 风格路径匹配
- 执行顺序:
- 应用
includes
→ 2. 应用excludes
- 应用
- 默认行为:
- 未配置
<includes>
:包含目录所有文件 - 未配置
<excludes>
:不排除任何文件
- 未配置
4. 多模块优先级总结
- 子模块 POM 配置 > 父 POM 配置
- 同模块内按
<resource>
顺序处理 - 依赖传递的资源 不会自动合并(需用 Assembly 插件)
五、最佳实践
-
统一父 POM 配置
公共资源在父 POM 定义,子模块按需覆盖<!-- 父 POM 定义模板 --> <resources><resource><directory>${project.basedir}/src/main/resources</directory><includes><include>**/*.tpl</include></includes></resource> </resources>
-
敏感信息过滤
结合 Maven Profiles 动态切换环境配置:<profile><id>prod</id><build><resources><resource><directory>src/main/resources-prod</directory><filtering>true</filtering></resource></resources></build> </profile>
-
冲突解决
同名文件按资源目录声明顺序覆盖:<!-- 优先使用 env 目录文件 --> <resource><directory>src/main/resources-env</directory> </resource> <resource><directory>src/main/resources</directory> </resource>
⚠️ 注意:默认资源目录
src/main/resources
一旦自定义配置,需显式声明才能生效!
六、配置样例
pom.xml 中配置
<!-- 配置 resource 后,会覆盖默认配置,必须显示配置 --><resource><!-- includes 不设置,默认目录下所有文件, 默认 filtering 为 false --><directory>src/main/resources</directory> <!-- 你的源目录 --><!--<includes><!–<include>**/*.properties</include> <!– 包含的文件类型 –><include>**/*.xml</include>–><include>**/*.*</include></includes>--><!--<targetPath>${project.build.directory}/classes</targetPath>--> <!-- 默认目录 --><!--<filtering>false</filtering> 默认--><!--<excludes><exclude>env/**/*.*</exclude></excludes>--></resource><!-- 拷贝脚本文件 --><resource><directory>scripts</directory><includes><include>*.sh</include></includes><targetPath>${project.build.directory}/scripts</targetPath></resource><resource><!-- 需要覆盖同名文件,需要 filtering 设置为 true, 默认 targetPath 为${project.build.outputDirectory} 即 target/classes 下--><directory>src/main/resources/env</directory><filtering>true</filtering></resource></resources>